CodeForces 522C Chicken or Fish?

Posted mingsd

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CodeForces 522C Chicken or Fish?相关的知识,希望对你有一定的参考价值。

Chicken or Fish?

题意比较难理解。

需要注意的是 就算某个人抱怨了 但是的t[i]也是他最后选择的结果。

题解:

首先考虑没有r[i] = 1的情况。 直接记录t[i]=0的数目,最后输出的时候比较a[i]和跳过的人的大小。

其次如果存在r[i]=1的情况, 则说明在前面就有一个菜品是被选完了。

        再明白的后面出现的菜品在这个点是不会被选完的。

        那么在后面不选完的菜品中,数目少于等于跳过的人都是可能被选完的。

        再其次为了考虑对其他菜品的影响,我们需要减去最少的菜品的数量,这样就可能使得更多的菜品也被选完。

 

技术图片
#include<bits/stdc++.h>
using namespace std;
#define Fopen freopen("_in.txt","r",stdin); freopen("_out.txt","w",stdout);
#define LL long long
#define ULL unsigned LL
#define fi first
#define se second
#define pb push_back
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define lch(x) tr[x].son[0]
#define rch(x) tr[x].son[1]
#define max3(a,b,c) max(a,max(b,c))
#define min3(a,b,c) min(a,min(b,c))
typedef pair<int,int> pll;
const int inf = 0x3f3f3f3f;
const int _inf = 0xc0c0c0c0;
const LL INF = 0x3f3f3f3f3f3f3f3f;
const LL _INF = 0xc0c0c0c0c0c0c0c0;
const LL mod =  (int)1e9+7;
const int N = 2e5 + 100;
int a[N];
int t[N], r[N];
int ok[N];
int m, k, lf;
int vis[N];
int main()
    int T;
    scanf("%d", &T);
    while(T--)
        scanf("%d%d", &m, &k);
        lf = 0;
        for(int i = 1; i <= k; ++i)
            scanf("%d", &a[i]);
        int f = 0;
        for(int i = 1; i < m; ++i)
            scanf("%d%d", &t[i], &r[i]);
            f += r[i];
        
        if(!f)
            int lf = 0;
            for(int i = 1; i < m; ++i)
                if(t[i]) a[t[i]]--;
                else lf++;
            
            for(int i = 1; i <= k; ++i)
                if(a[i] <= lf) putchar(Y);
                else putchar(N);
            
        
        else
            for(int i = 1; i <= k; ++i) vis[i] = 0, ok[i] = 1;
            int lf = 0;
            for(int i = 1; i < m; ++i)
                if(r[i] && f)
                    f = 0;
                    for(int j = i; j < m; ++j)
                        vis[t[j]] = 1;
                    int Mn = INF;
                    for(int j = 1; j <= k; ++j)

                        if(vis[j]) continue;
                        if(a[j] > lf) continue;
                        Mn = min(Mn, a[j]);
                        ok[j] = 0;
                    
                    lf -= Mn;
                
                if(t[i]) a[t[i]]--;
                else lf++;
            
            for(int i = 1; i <= k; ++i)
                if(a[i] <= lf || !ok[i]) putchar(Y);
                else putchar(N);
            
        
        puts("");
    
    return 0;
View Code

 

以上是关于CodeForces 522C Chicken or Fish?的主要内容,如果未能解决你的问题,请参考以下文章

2018 Arab Collegiate Programming Contest (ACPC 2018) G. Greatest Chicken Dish (线段树+GCD)

Coffee Chicken

Spicy Chicken GDI in C#

HDU 3639 Hawk-and-Chicken

D. Feeding Chicken(构造)

4月11 打卡