美文网首页
区域赛增补名额选拔赛第C题

区域赛增补名额选拔赛第C题

作者: 谈的还原性 | 来源:发表于2018-09-27 11:46 被阅读0次

    题目大意

    题目链接


    求两个时刻距离的变化大小,开始距离大的,在相同时间里面距离的变化就更大。判断给出的数据是否满足这个条件

    分析

    直接模拟过程


    代码

    #include <bits/stdc++.h>
    #define MAX_N 100000
    using namespace std;
    typedef long long ll;
    struct number
    {
        int x;
        int y;
        int z;
    }num1[MAX_N],num2[MAX_N];//这道题没有必要存每个星球的坐标
    struct result
    {
        ll res1;
        ll res2;
        ll sub;
    }res[MAX_N];
    bool cmp1(result a,result b)
    {
        if(a.res1!=b.res1)
            return a.res1<b.res1;
        return a.res2<b.res2;
    }
    bool cmp2(result a,result b)
    {
        if(a.res2!=b.res2)
            return a.res2<b.res2;
        return a.res1<b.res1;
    }
    int main(int argc, char const *argv[])
    {
        int n,t,s;
    //  freopen("date.txt","r",stdin);
        scanf("%d%d%d",&n,&t,&s);
        /*在这儿不要想当然的就以为t<s*/
        for(int i=0;i<n;i++)
        {
            int a,b,c;
            scanf("%d%d%d",&a,&b,&c);
            num1[i].x=a;
            num1[i].y=b;
            num1[i].z=c;
        }
        for(int i=0;i<n;i++)
        {
            int a,b,c;
            scanf("%d%d%d",&a,&b,&c);
            num2[i].x=a;
            num2[i].y=b;
            num2[i].z=c;
        }
        for(int i=1;i<n;i++)
        {
            ll mid1=(ll)(num1[i].x-num1[0].x)*(num1[i].x-num1[0].x);
            ll mid2=(ll)(num1[i].y-num1[0].y)*(num1[i].y-num1[0].y);
            ll mid3=(ll)(num1[i].z-num1[0].z)*(num1[i].z-num1[0].z);
            /*以后只要涉及到类型转换的,都用强制转换,
            否则数据大了之后在自动转换之前就已经溢出*/
            ll mid4=mid1+mid2+mid3;
            res[i].res1=mid4;
            //res[i].res1=sqrt(mid4)
        }
        for(int i=1;i<n;i++)
        {
            ll mid1=(ll)(num2[i].x-num2[0].x)*(num2[i].x-num2[0].x);
            ll mid2=(ll)(num2[i].y-num2[0].y)*(num2[i].y-num2[0].y);
            ll mid3=(ll)(num2[i].z-num2[0].z)*(num2[i].z-num2[0].z);
            ll mid4=mid1+mid2+mid3;
            res[i].res2=mid4;
            res[i].sub=res[i].res2-res[i].res1;
        }//造成了空间上的浪费,在每次输入的时候就计算距离并且存储到res当中
        if(t<s)
        {
            sort(res+1,res+n,cmp1);
            int flag=0;
            for(int i=1;i<n;i++)
            {
                if((res[i].res1>=res[i].res2))
                {
                    flag=1;
                    break;
                }
                if((i+1)<n)
                {
                    if(res[i].res1==res[i+1].res1&&res[i].sub!=res[i+1].sub)
                    {
                        flag=1;
                        break;
                    }
                    else if(res[i].sub>=res[i+1].sub)
                    {
                        flag=1;
                        break;
                    }
                    /*这个细节就在于读题目的仔细,题目说离地球越远的星球的远离速度越快
                    换言之就是如果距离地球的距离相等的话,那么远离的速度也是相等的*/
                }
                /*最开始的时候并没有分成两个if语句,要么就造成数据越界,要么最后一个
                  位置的时候无法比较res[i].res1和res[i].res2的大小
                */
            }
            if(flag)
                printf("No\n");
            else
                printf("Yes\n");
        }
        else 
        {
            sort(res+1,res+n,cmp2);
            int flag=0;
            for(int i=1;i<n;i++)
            {
                if((res[i].res1<=res[i].res2))
                {
                    flag=1;
                    break;
                }
                if((i+1)<n)
                {
                    if(res[i].res2==res[i+1].res2&&res[i].sub!=res[i+1].sub)
                    {
                        flag=1;
                        break;
                    }
                    else if(res[i].sub<=res[i+1].sub)
                    {
                        flag=1;
                        break;
                    }
                }
            }
            if(flag)
                printf("No\n");
            else
                printf("Yes\n");
        }
        return 0;
    }
    

    总结
    读题一定要仔细,不要在读题上面省略时间。然后,一定要把细节处理到位,不然即使思路大致正确,但还是不能通过

    相关文章

      网友评论

          本文标题:区域赛增补名额选拔赛第C题

          本文链接:https://www.haomeiwen.com/subject/wvteoftx.html