比赛 201712练习 评测结果 AAAAAAAAAA
题目名称 荒岛野人 最终得分 100
用户昵称 胡嘉兴 运行时间 0.480 s
代码语言 C++ 内存使用 0.31 MiB
提交时间 2017-12-23 10:59:09
显示代码纯文本
#include<bits/stdc++.h>
#define N 17
#define MX 1000001
using namespace std;
int n, c[N], p[N], l[N];
int exgcd(int a, int b, int& x, int& y)
{
    if(!b)
    {
        x = 1;
        y = 0;
        return a;
    }
    int ret = exgcd(b, a%b, y, x);
    y -= x*(a/b);
    return ret;
}
inline bool check(int m)
{
    int x, y, z;
    for(int i = 1; i <= n; i++)
    {
        for(int j = i+1; j <= n; j++)
        {
            int dp = p[j]-p[i], dc = c[j]-c[i], dm;
            z = exgcd(dp, -1*m, x, y);
            if((-1*dc)%z!=0)
            {
                continue;
            }
            x *= -1*dc;
            x /= z;
            y *= -1*dc;
            y /= z;
            dm = m/z;
            if(x<0)
            {
                int t = (0-x)/dm;
                x += dm*(t+1);
                if(x<=min(l[i], l[j]))
                {
                    return 0;
                }
            }
            else if(x>=0)
            {
                x %= dm;
                if(x<=min(l[i], l[j]))
                {
                    return 0;
                }
            }
        }
    }
    return 1;
}
int main()
{
    int lower = 0;
    freopen("savage.in","r",stdin);
	freopen("savage.out","w",stdout);
    scanf("%d", &n);
    for(int i = 1; i <= n; i++)
    {
        scanf("%d%d%d", &c[i], &p[i], &l[i]);
        lower = max(lower, c[i]);
        c[i]--;
    }
    for(int i = lower; i <= MX; i++)
    {
        if(check(i))
        {
            printf("%d\n", i);
            break;
        }
    }
    return 0;
}