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

2018-09-27  本文已影响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;
}

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

上一篇下一篇

猜你喜欢

热点阅读