题目大意
求两个时刻距离的变化大小,开始距离大的,在相同时间里面距离的变化就更大。判断给出的数据是否满足这个条件
分析
直接模拟过程
代码
#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;
}
总结
读题一定要仔细,不要在读题上面省略时间。然后,一定要把细节处理到位,不然即使思路大致正确,但还是不能通过
网友评论