Bzoj1407 Savage
2016-07-11 14:40
225 查看
Description
Input
第1行为一个整数N(1<=N<=15),即 野人的数目。第2行到第N+1每行为三个整数Ci, Pi, Li (1<=Ci,Pi<=100, 0<=Li<=106 ),表示每个野人所住的初始洞穴编号,每年走过的洞穴数及寿命值。Output
仅包含一个数M,即最少可能的山洞数。输入数据保证有解,且M不大于106。Sample Input
31 3 4
2 7 3
3 2 1
Sample Output
6该样例对应于题目描述中的例子。
考虑两个野人i、j的情况:设他们在x年后相遇,则得到该式: P[i]*x+C[i]=P[j]*x+C[j](mod M)
化为同余方程: (P[i]-P[j])*x+k*M=C[j]-C[i]
按照题目要求,我们需要找到一个M,使得上式无解或者x>min(C[i],C[j]) (在野人有生之年没有相遇)
问题扩展到所有野人,由于数据范围很小,可以直接枚举M,判断是否所有野人之间都满足要求。
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> using namespace std; const int mxn=1000; int c[mxn],le[mxn],p[mxn]; int n; int m; int gcd(int a,int b){ return b?gcd(b,a%b):a; } int exgcd(int a,int b,int &x,int &y){ if(b==0){ x=1; y=0; return a; } exgcd(b,a%b,x,y); int t=x; x=y; y=t-(a/b)*y; } bool judge(int m){ int i,j; int t,x,y; for(i=1;i<n;i++){ for(j=i+1;j<=n;j++){ int a=p[i]-p[j]; int b=m; int c1=c[j]-c[i]; t=gcd(a,b); if(c1%t==0){ a/=t;b/=t;c1/=t; exgcd(a,b,x,y); b=abs(b); x=((c1*x)%b+b)%b; if(!x)x+=b; if(x<=min(le[i],le[j]))return 0; } } } return 1; } int main(){ scanf("%d",&n); int i,j; m=0; for(i=1;i<=n;i++){ scanf("%d%d%d",&c[i],&p[i],&le[i]); if(c[i]>m)m=c[i]; } for(i=m;i;i++){ if(judge(i)){ printf("%d\n",i); break; } } return 0; }
相关文章推荐
- dubbo服务器集群的时候,测试服务器更新了最新代码,开发还未更新,调用接口的时候时好时坏
- 将pdf在线转换成图片格式的方法
- 开始我的进阶之路
- js中return的作用
- hadoop1.x和2.x的一些主要区别
- HTTP::Request
- HTTP::Request
- mysql 密码问题解决方案
- IOS用CGContextRef画各种图形(文字、圆、直线、弧线、矩形、扇形、椭圆、三角形、圆角矩形、贝塞尔曲线、图片)
- 正则表达式简单特殊符号说明
- 导游【并查集】
- Linux epoll详解
- hdu 5105 Math Problem(数学)
- 使用Smarty模板2.x注入变量报错
- java打印二维数组
- AOJ-782 整倍数
- ORB特征
- 浦发银行大数据库表备份设计思路(数据泵)
- 非常好的博客!!!linux内存管理概述【转】
- PAT-乙级-1003. *我要通过!(20)