• 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 Round #172 (Div. 2) B. Nearest Fraction
    什么是DWR
    1310 N皇后问题
    ural Bus Routes(dfs深搜)
    ural Russian Pipelines(最短路)
    ural Graph Decomposition
    ural Network ( 最小生成树)
    poj 1579 Function Run Fun ( 记忆化搜索 )
    计算某一天的前一天的日期
    DataStructGraphpart1
  • 原文地址:https://www.cnblogs.com/MingSD/p/11127074.html
Copyright © 2020-2023  润新知