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;
}

猜你喜欢

转载自www.cnblogs.com/wyh447154317/p/12165901.html