我是靠谱客的博主 缥缈电灯胆,最近开发中收集的这篇文章主要介绍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

 

转载于:https://www.cnblogs.com/MingSD/p/11127074.html

最后

以上就是缥缈电灯胆为你收集整理的CodeForces 522C Chicken or Fish?的全部内容,希望文章能够帮你解决CodeForces 522C Chicken or Fish?所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(47)

评论列表共有 0 条评论

立即
投稿
返回
顶部