【[USACO18OPEN]Lemonade Line】-水题转载自洛谷博客

P4379 【[USACO18OPEN]Lemonade Line】


简单地,根据题面,我们可以得出,这道题就是奶牛发脾气,每一只奶牛都不愿自己前面有$w[i]$只奶牛,而农夫$John$想要给出最少的饮料——就是要让排队的牛最少

要使得排队的牛最少,果断$$sort$$,将脾气最好($w[i]$最大)的奶牛排在最前面,把其他奶牛都气走。。。由于每头奶牛都是一头一头来的,我们可以抽象成:一只奶牛来,先走进队伍,看到前面牛太多了,走回去,把下一只牛叫来,下一只牛走进队伍,看了看牛,如果牛太多就走,不多就留着。这一过程。。。

具体的,我们来看注释


#include<bits/stdc++.h>
using namespace std;
int n,w[100010];
bool cmp(int x,int y){
    return x>y;//从大到小排
}
int main(){
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        scanf("%d",&w[i]);//输入每头牛前面允许排的牛的个数
    }
    sort(w+1,w+1+n,cmp);//sort啦
    int wait=n,still=0;//wait代表最后在排的牛,我们把wait设置成最大,没气走一头就wait--。still为当前队伍里在排队的牛,初始为0
    for(int i=1;i<=n;i++){//从w[i]最大的牛开始枚举
        if(w[i]<still){//如果有牛已经等不下去了(在它前面排队的牛太多了)
            wait--;//它就被气走了,最后排队的牛的个数--
            still--;//还在排队的牛的个数--
        }
        still++;//如果它没有被气走,它就入队,如果他被气走了,仍然在排队的牛的数量不变
    }
    printf("%d",wait);
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/Forever-chen/p/12168061.html