洛谷 3093 奶牛调度

来源:互联网 发布:软件开发工具是什么 编辑:程序博客网 时间:2024/05/11 03:58

go to the problem

%% loi_black.

做法一 (我的)

对于奶牛的截止时间从小到大排序,记当前的最大答案为ans,累积的挤奶牛的总时间为sum。则对于当前奶牛,能挤就挤,不然就比较当前奶牛和之前挤过的奶牛的最小挤奶量,如果大于,就放弃那个,选择当前这个。不然就不做处理。

#include<iostream> #include<cstdio>#include<algorithm>#include<cmath>#include<cstring>#include<queue>using namespace std;int N,ans=0,sum=0;struct maple{    int g,d;}cow[10010];bool cmp(maple a,maple b){    return a.d<b.d;}priority_queue<int,vector<int>,greater<int> > q;int main(){    scanf("%d",&N);    for(int i=1;i<=N;++i)        scanf("%d%d",&cow[i].g,&cow[i].d);    sort(cow+1,cow+N+1,cmp);    for(int i=1;i<=N;++i)    {       if(sum<cow[i].d)        {           ++sum;           ans+=cow[i].g;           q.push(cow[i].g);       }        else if(!q.empty())           if(q.top()<cow[i].g)           {               ans-=q.top();               q.pop();               ans+=cow[i].g;               q.push(cow[i].g);           }    }     printf("%d",ans);    return 0;}

做法二(loi_black的)

发现如果我尽可能的用最大的挤奶量的奶牛把当前时间都排满的话答案一定是更优的。

那么我就从最大的截止时间开始往前枚举(–i)

对于每个时刻都把截止时间为当前时刻的奶牛都放堆里,

然后就是每个时刻能挤就挤,只挤当前堆里挤奶量最大的奶牛 。

既然是把时间从后往前找,就可以保证所挤的每个奶牛都是合法的。

详见black博客qwq。

PS:非常感谢black学长的耐心讲解。

原创粉丝点击