gdutcode 1195: 相信我这是水题 GDUT中有个风云人物pigofzhou,是冰点奇迹队的主代码手,
1195: 相信我这是水题
Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 821 Solved: 219
Description
GDUT中有个风云人物pigofzhou,是冰点奇迹队的主代码手,萌萌的师弟师妹们们经常会让pigofzhou帮他们Debug,因为师弟师妹们打代码使用编程语言的种类千奇百怪,pigofzhou为此很头疼。现在假设师弟师妹们只喜欢Java或者C++或者C,因为他希望所有人都学相同的编程语言,只有这样pigofzhou教的时候才相对轻松,经过彻夜研究发现,他可以通过自己的花言巧语使两个不同爱好的人的爱好变成另一个爱好(比如他对一个喜欢Java的和一个喜欢C++的人使用花言巧语,那么这两个人都会喜欢C语言) 那么问题来了,聪明的pigofzhou能否通过若干次花言巧语来让所有人都学同一门编程语言。
Input
第一行包含了一个整数T-----表示输入数据为T组(T <= 100)。 每组测试样例有3个数字a,b,c;分别代表喜欢Java,喜欢C++,喜欢C的人数。(输入数据范围为int型)
Output
如果pigofzhou能够通过若干次改变使得所有人学相同的编程语言,输出“YES”,否则输出“NO”(不带引号);
Sample Input
1 1 1 1
Sample Output
YES
HINT
人数范围为int型
Source
1 /* gdutcode 1195 ____________________ 2 #include<bits/stdc++.h> 3 using namespace std; 4 typedef long long ll; 5 typedef pair<ll,ll> pll; 6 #define pb(x) push_back(x) 7 #define ss(x) scanf("%s",x) 8 #define sd(x) scanf("%d",&x) 9 #define sll(x) scanf("lld",&x) 10 typedef unsigned long long ull; 11 #define mem(A, X) memset(A, X, sizeof A) 12 #define ford(i,l,u) for(ll (i)=(ll)(l);(i)>=(ll)(u);--(i)) 13 #define foreach(e,x) for(__typeof(x.begin()) e=x.begin();e!=x.end();++e) 14 #define fori(i,l,u) for(ll (i)=(ll)(l);(i)<=(ll)(u);++(i)) 15 #define delete_this freopen("in.txt","r",stdin) 16 #define sd2(x,y) scanf("%d%d",&x,&y) 17 #define slf(x) scanf("%lf",&x) 18 #define sc(x) scanf("%c",&x) 19 typedef pair<int,int> pii; 20 #define sec second 21 #define fir first 22 23 const ll mod=1e9+7; 24 const ll maxn=1e5+10; 25 26 int main() 27 { 28 delete_this; 29 int tc; 30 while(cin>>tc) 31 { 32 fori(kase,1,tc) 33 { 34 int a,b,c; 35 cin>>a>>b>>c; 36 37 int flag=0; 38 39 int t=abs(b-c); 40 if(t%3==0) flag=1; 41 42 t=abs(a-c); 43 if(t%3==0) flag=1; 44 45 t=abs(a-b); 46 if(t%3==0) flag=1; 47 48 //if(a==c||a==b||b==c) flag=1; 49 50 if(flag) cout<<"YES"<<endl; 51 else cout<<"NO"<<endl; 52 53 } 54 } 55 return 0; 56 } 57 58 /*__________ 59 analysis: 一句话:只要存在两种语言的差值能够拆分成若干个3就可以通过依次分解这若干个3使其到达yes。 否则不能。 60 设三种分别为a,b,c,考虑三个数字的两两之差t1,t2,t3,(现在ti的差有非常多的可能,下面简化分类。) 61 考虑存在ti取哪些值能够yes, 只要有一个ti=0 yes,下面考虑当ti=1,2 ,3.... 62 事实上ti=3 6 9.。。 为其充分必要条件。 63 充分: 先证差为3: 设 x x+3 y(y>=0) 64 则可以在前两个中均取x个,状态转化为 0 3 y+2x 65 若y+2x==0,已经yes.否则,从y+2x和3中各取1个,状态转化为 2 2 y+2x-1 显然yes. 66 现在考虑差为6 9 ... 同样的设: x x+3+3+3+3... y 67 同样的均取x, 0 3+3+3... y+2x 68 同样,y+2x=0,yes.否则,先考虑单个3,从y+2x与3中各取1,状态2 y+2x 2+3+3... 69 此时,取第一个和第三个中的2,状态转化为0 y+2x+4 0+3+3..., 70 分析这部分的效果: 三的个数被这一操作减少了一,即差值多个三 71 可以不断执行这个操作,最终到达上面的差值一个三的状态。 72 73 必要性: 反证:将a b c 对3取模以后划归,只考虑不存在两个数字相等的情况,只有0 1 2 这一种情况, 74 于是,0 1 2 只能转移到 2 0 1 等价于未转移。所以只要在证可以取模即可:3x 3y+1 3z+2 75 每次只洗脑2个人是最基本的操作(所以很多人的情况是这基本操作的多次执行), 76 1 2 3x-1 3y 3z+3+1 77 1 3 3x-1 3y+3 3z+1 78 2 3 3x+2 3y 3z+1 都可以写成3u+2 3v 3w+1,也就是说所有可能转移到的状态始终维持 79 在这种类似(0 1 2)的状态,所以永远转移不到yes. 80 debug : 81 note : 82 */