【贪心】SOJ 13983

SOJ 13983. Milk Scheduling

这是比赛题,还是作死的我最讨厌的英文题,题目大意就是有n头奶牛,要在喂奶截止时间前给他喂奶并得到相应的含量的牛奶。
一开始的想法就是挑选截止日期的最大产奶量的那头牛喂养,后来果不其然的WA了。
空闲的时间也可以给奶牛喂奶啥的....bug不要太多。
于是改来改去了,期间又WA了几发,总算是A掉了,但是代码也是要多搓有多搓,估计除了我自己没人看得懂。
所以后来选用了优先队列,STL的东西用顺手了还是蛮好用的。还用了pair类。
思路从截止日期最大的倒着推回来,可以把没过截止日期的放入队列里选择。每次选择最优。优先队列访问顶元素得到最优解加起来。
一开始是没想过这种情况,比如说时间为t时候,有正好t1时刻的g1和截止日期为t2(t2>t1)时刻的g2(t2时刻最大的不是gi),而g2>g1此时就选g2。
/**
测试实例:
4
10 3
7 5
8 1
2 1

25
**/
#include<cstdio>
#include<queue>
#include<algorithm>
#define MAXN 10000
using namespace std;
typedef pair<int ,int> P;
priority_queue<int> q;
int n,ans;
P a[MAXN+10];
int main()
{
	while(~scanf("%d",&n))
	{
        for(int i=1;i<=n;i++)
            scanf("%d%d",&a[i].second,&a[i].first);
        sort(a+1,a+1+n);   //sort对pair先排first(本题中的d)从小到大,再排second(本题中g)从小到大
        for(int t=a[n].first,j=n;t>=1;t--)   //倒着选
        {
            for(;j>=1&&t<=a[j].first;j--)  //将当前所有解入队列,排过序。
                q.push(a[j].second);
            if(!q.empty())
            {
                ans+=q.top();  //选择最优解
                q.pop();  //已选择则扔出去233333
            }
        }
        printf("%d\n",ans);
        }
	return 0;
}


转载于:https://www.cnblogs.com/MIKORU/p/5796755.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值