Educational Codeforces Round 79 A. New Year Garland
https://codeforces.com/contest/1279/problem/A
思路:不妨设R>=G>=B,因为R的数量最多,故以R为界,相邻的两个R之间只可能是一个G或一个B或一个G和一个B
按以下策略构造,先放全部的R,再在相邻的两个R之间放一个B 因为R有R+1个空隙,所以一定能放完所有的B,可能还有相邻的两个R之间或第一个R前面或最后一个R后面为空
接下来先把G补满相邻的两个R之间为空的位置,显然若不能补满相邻的两个R之间为空的位置,则无法构造出符合题意的序列
若还有G剩余,则先放在第一个R前面和最后一个R后面,再在每个B左侧或右侧放一个G(其实每个B两侧各放一个G,也符合题意,但由一般性假设R>=G>=B,单独考虑G(B)时,在相邻的两个R
之间放一个G(B),必定能将G(B)放完)
综上,只要G+B>=R-1即可 当G+B=R-1、R、R+1时,在相邻的两个R之间或第一个R前面或最后一个R后面放一个G或B即可
当G+B>R+1时,B放完后还剩R+1-B个位置可以单独放一个G,故G还剩G-(R+1-B)=G+B-R-1>0个,将其与B放在一起,而B有B个位置,B-(G+B-R-1)=R+1-G>=1,故能将剩下的G放完,即在每个B左侧或右侧放一个G后,还有相邻的两个R之间只有一个B
官方:
# #include<bits/stdc++.h> #define ll long long using namespace std; int main(){ ios::sync_with_stdio(false); cin.tie(0); int T; cin>>T; while(T--){ int m1=0,m2=0,m3=0,a,b,c; cin>>a>>b>>c; ll sum=a+b+c; if(a>b){ if(a>c){m1=a;if(b>c)m2=b,m3=c;else m2=c,m3=b; } else{m1=c;if(b>a)m2=b,m3=a;else m2=a,m3=b; } } else{ if(b>c){m1=b;if(a>c)m2=a,m3=c;else m2=c,m3=a; } else{m1=c;if(b>a)m2=b,m3=a;else m2=a,m3=b; } } if(m2+m3>=m1-1) cout<<"Yes"<<endl;//if(sum-m1>=m1-1&&m2-m1<m3) else cout<<"No"<<endl; } return 0; }
,