Codeforces 1369 E. DeadLee —— 想法,貪心

This way

題意:

現在有n種菜,每種菜都有wi碟,你有m個朋友,每個朋友都有兩種喜歡的菜,你按照某個排序讓朋友一個一個來喫菜,如果現在桌上有這個朋友喜歡的菜,他就會每種都喫一碟,但是如果兩種菜都沒了,你就會死。問你最後你會不會死,如果不會輸出這個排序。

題解:

假設喜歡喫第i種菜的總人數是si,如果si<=wi,那麼就意味着喜歡喫第i種菜的人一定都可以喫到,於是我們將這些人往後排,我這裏使用了棧來存儲。然後對於這些人另一個喜歡喫的菜sj-1,這樣依次到最後。如果有某個時候所有的si>wi的話,就是不可能了,因爲假設所有的si=wi+1,那麼對於第一個菜,有wi個人能喫到,然後最後一個人就要去別的地方競爭,到最後還是會有人喫不到菜。

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N=2e5+5;
int s[N],w[N],a[N],b[N];
bool vis[N];
vector<int>vec[N];
queue<int>Q;
stack<int>ans;
int main()
{
    int n,m;
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)
        scanf("%d",&w[i]);
    for(int i=1;i<=m;i++){
        scanf("%d%d",&a[i],&b[i]);
        vec[a[i]].push_back(i),vec[b[i]].push_back(i);
        s[a[i]]++,s[b[i]]++;
    }
    for(int i=1;i<=n;i++)
        if(s[i]&&s[i]<=w[i])
            Q.push(i);
    while(!Q.empty()){
        int u=Q.front();Q.pop();
        for(auto j:vec[u]){
            if(vis[j])continue;
            ans.push(j);
            vis[j]=1;
            int oth=a[j]==u?b[j]:a[j];
            s[oth]--;
            if(s[oth]==w[oth])
                Q.push(oth);
        }
    }
    if(ans.size()!=m)
        return 0*printf("DEAD\n");
    printf("ALIVE\n");
    while(!ans.empty())
        printf("%d ",ans.top()),ans.pop();
    return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章