1 条题解
-
0Guest LV 0
-
0
#include<bits/stdc++.h>
using namespace std;
int n,maxn=0;
//当两个野人要相遇 即 Ci+tPi与 Cj+tPj模m同余
//整理完后为t(Pi-Pj)+my=Cj-Ci 然后套模板
struct node{
int C;
int P;
int L;
}f[200];
int gcd(int a,int b)
{
if(b==0) return a;
return gcd(b,a%b);
}
void Edge(int a,int b,int &x,int &y)
{
if(!b)
{
x=1;
y=0;
return ;
}
Edge(b,a%b,x,y);
int temp=x;
x=y;
y=temp-(a/b)*y;
}
bool check(int m)
{//实际上就是对扩展欧几里得算法的验证 如果结果无解 则表示不会有任何两个野人相遇
//当然当m的值最后算出来≤两个野人的最小寿命也是不行的 (m=b)
int x,y;
for(int i=1;i<n;i++)
{
for(int j=i+1;j<=n;j++)
{
int a=f[i].P-f[j].P;
int b=m;
int c=f[j].C-f[i].C;
int g=gcd(a,b);
if(c%g==0)
{
a=a/g;
b=b/g;
c=c/g;
Edge(a,b,x,y);
a=abs(a);
b=abs(b);//a,b可能结果会是负数 所以都取绝对值避免后面计算出错
x=((c*x)%b+b)%b;
if(x<=min(f[i].L,f[j].L)) return 0;
}
}
}
return 1;
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>f[i].C>>f[i].P>>f[i].L;
maxn=max(maxn,f[i].C);
}
for(int i=maxn;;i++)
{
if(check(i))
{
cout<<i<<endl;
break;
}
}
return 0;
}
//来自某届石光中学信竞苟蒻学长 愿看到此文的你 努力码题 为校争光
- 1