zoukankan      html  css  js  c++  java
  • Codeforces 839B贪心

    题意

    飞机有n排如图座位,给出k个部落和各部落人数ai,问能否安排使得所有人入座且不同部落的人都不会紧邻。数据保证总人数不超过总座位数。

    分析

    首先考虑所有4个人同部落的组合,优先安排在中间的四座上,如果四座坐满,再安排在二坐上。此时剩下的人不会有(超过)四个人来自同一部落。

    然后考虑所有2个人同部落的组合,优先安排在两边的二坐上,如果二坐坐满,再安排在四座上。此时剩下的人不会有(超过)两个人来自同一部落,即剩下的t个人都来自不同部落。

    考虑三个人坐四座,AA_A还是AAA_,两种情况都不能再坐进其他部落的人,不妨腾出一个单座供剩下的人坐成AA_B(也即第三个A看作剩下的人)。

    设四座数量为a,二座数量为b,三座数量为c,此时还能坐下a*2+b+c个不同部落的人。若t<=a*2+b+c则剩下的人都有位置坐,否则没有符合的方案。

    代码

    int n,k,t[10007],tot;
    bool ac(){
        int a=n,b=n*2,c=0;
        for(int i=1;i<=k&&a;i++){
            tot-=t[i];
            if(t[i]/4>a){
                t[i]-=a*4;a=0;
            }
            else{
                a-=t[i]/4;t[i]%=4;
            }
            tot+=t[i];
            if(tot==0)return true;
        }
        for(int i=1;i<=k&&b;i++){
            tot-=t[i];
            if(t[i]/2>b){
                t[i]-=b*2;b=0;
            }
            else{
                b-=t[i]/2;t[i]%=2;
            }
            tot+=t[i];
            if(tot==0)return true;
        }
        
        for(int i=1;i<=k&&a;i++){
            tot-=t[i];
            if(t[i]/2>a){
                t[i]-=a*2;c+=a;a=0;
            }
            else{
                a-=t[i]/2;c+=t[i]/2;t[i]%=2;
            }
            tot+=t[i];
            if(tot==0)return true;
        }
        return tot<=a*2+b+c;
    }
    int main(){
        scanf("%d%d",&n,&k);
        tot=0;
        for(int i=1;i<=k;i++){
            scanf("%d",&t[i]);tot+=t[i];
        }
        printf(ac()?"YES\n":"NO\n");
        return 0;
    }
    

      

  • 相关阅读:
    Codeforces Round #197 (Div. 2)
    hdu4499Cannon(搜索)
    poj1054The Troublesome Frog
    hdu4705Y
    hdu1054Strategic Game(树形DP)
    poj2029Get Many Persimmon Trees(最大矩阵和)
    poj3280Cheapest Palindrome(记忆化)
    poj3140Contestants Division
    Spring的AOP机制---- 各类通知总结---- 各类通知总结
    Spring的AOP机制---- AOP最终通知---- AOP最终通知
  • 原文地址:https://www.cnblogs.com/shuiming/p/7352267.html
Copyright © 2011-2022 走看看