您的位置:首页 > 其它

Codeforces 913D - Too Easy Problems

2018-01-10 09:25 417 查看

题面

题意

给出n道题目,每个题目有一个a,一个b,需要b时间来完成,并且题目总量小于等于a时,此题有效,一题一分,输出用t时间得到的最高分以及做题方案.

做法

因为每一题的分值一样,因而可以用贪心来做,先将所有题目按照a从高到低排序(这样排序则扫到后面不需要考虑题目总量是否超过a),之后维护一个按时间排序的大根堆和size,sum记录此时做题数量和花时间的总和,按之前的排序来考虑,每道题只考虑三种操作:

1.插入 时间之和不超过t.

2.替换 比堆中时间最长的题的时间要短

3.不做任何操作

当此时的size小于等于当前考虑题目的a时,即为最大值(后面的题目都无效),输出即可.

代码

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<queue>
#define N 200100
using namespace std;

int n,sum,ans,size,t,as
,aa;
struct Node
{
int time_need,most,pos;
bool operator < (const Node &u) const
{
return time_need<u.time_need;
}
} node
;
priority_queue<Node>pq;

inline bool cmp(Node u,Node v)
{
return u.most>v.most||u.most==v.most&&u.time_need<v.time_need;
}

int main()
{
int i,j;
cin>>n>>t;
for(i=1; i<=n; i++)
{
scanf("%d%d",&node[i].most,&node[i].time_need);
node[i].pos=i;
}
sort(node+1,node+n+1,cmp);
for(i=1; i<=n; i++)
{
if(node[i].most<=size)
{
printf("%d\n%d\n",size,size);
for(; !pq.empty(); pq.pop())
{
printf("%d ",pq.top().pos);
}
return 0;
}
if(sum+node[i].time_need<=t)
{
pq.push(node[i]);
size++;
sum+=node[i].time_need;
}
else if(!pq.empty()&&node[i].time_need<pq.top().time_need)
{
sum-=pq.top().time_need-node[i].time_need;
pq.pop();
pq.push(node[i]);
}
}
printf("%d\n%d\n",size,size);
for(; !pq.empty(); pq.pop())
{
printf("%d ",pq.top()
b67b
.pos);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: