1 条题解

  • 0
    @ 2019-09-30 13:25:29

    #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

信息

难度
9
分类
数论 | 数学 点击显示
标签
递交数
5
已通过
3
通过率
60%
上传者