博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
BZOJ1407 NOI2002 Savage 【Exgcd】
阅读量:5217 次
发布时间:2019-06-14

本文共 1338 字,大约阅读时间需要 4 分钟。

BZOJ1407 NOI2002 Savage


Description

这里写图片描述

Input

第1行为一个整数N(1<=N<=15),即野人的数目。

第2行到第N+1每行为三个整数Ci, Pi, Li表示每个野人所住的初始洞穴编号,每年走过的洞穴数及寿命值。
(1<=Ci,Pi<=100, 0<=Li<=10^6 )

Output

仅包含一个数M,即最少可能的山洞数。输入数据保证有解,且M不大于10^6。

Sample Input

3

1 3 4
2 7 3
3 2 1

Sample Output

6

//该样例对应于题目描述中的例子。


首先看到了M<=1e6,然后就可以暴力枚举M的值

然后确定了M的值之后,我们对于两个野人i和j可以列出
(Ci+xpi)(Cj+xpj)=yM(Ci+x∗pi)−(Cj+x∗pj)=y∗M
xmin(li,lj)x≤min(li,lj)的时候就不成立(会相遇)
求出x的最小整数解判断一下就行了


#include
using namespace std;#define N 20#define M 1000000int n;int c[N],p[N],l[N];void exgcd(int a,int b,int &x,int &y){ if(!b)x=1,y=0; else{ exgcd(b,a%b,y,x); y-=(a/b)*x; }}int gcd(int a,int b){ if(!b)return a; return gcd(b,a%b);}bool judge(int i,int j,int s){ int anow=p[i]-p[j],bnow=s,cnow=c[j]-c[i]; int x,y,d=gcd(anow,bnow); if(cnow%d)return 1; exgcd(anow,bnow,x,y); int w=abs(s/d); x=((x*cnow/d)%w+w)%w; if(x<=l[i]&&x<=l[j])return 0; return 1;}bool check(int s){ for(int i=1;i<=n;i++) for(int j=i+1;j<=n;j++) if(!judge(i,j,s))return 0; return 1;}int main(){ int down=0; scanf("%d",&n); for(int i=1;i<=n;i++)scanf("%d%d%d",&c[i],&p[i],&l[i]),down=max(down,c[i]); for(int i=down;i<=M;i++) if(check(i)){
printf("%d",i);return 0;} return 0;}

转载于:https://www.cnblogs.com/dream-maker-yk/p/9676307.html

你可能感兴趣的文章
正则--密码强度验证
查看>>
C#电脑自动关机代码指令
查看>>
Problem D: Flip Five
查看>>
uva 10603
查看>>
Struts2面试题
查看>>
GIT分支管理是一门艺术
查看>>
hdu 6073 Matching In Multiplication(拓扑排序+欧拉回路)
查看>>
挂载数据盘
查看>>
lintcode-28-搜索二维矩阵
查看>>
【洛谷1501】[国家集训队] Tree II(LCT维护懒惰标记)
查看>>
764. Largest Plus Sign
查看>>
驱动-helloworld(第一天)
查看>>
loj#6281. 数列分块入门 5
查看>>
hdoj5893
查看>>
理解管理信息系统
查看>>
第三章:选择结构(一)
查看>>
缓存(Cache)学习笔记
查看>>
Vue2.0 的漫长学习ing-1-3
查看>>
mount命令(用来挂载硬盘或镜像等)
查看>>
Bash shell中的位置参数$#,$*,$@,$0,$1,$2...及特殊参数$?,$-等的含义
查看>>