传送门
因为没有UVA账号,所以不知道这个程序对不对
题意翻译
给定 n件物品,第 i 件物品有如下信息:
- 卖出去可以得到 p i p_i pi 的收益。
- 过期时间为 d i d_i di,过了过期时间就不能再卖出去。
卖掉一件物品要用 1的时间,求最大收益。
多组数据,每组数据一行,首先一个整数 n然后 n 对数
p
i
,
d
i
p_i,d_i
pi,di,以文件终止符结束。
0
≤
n
≤
1
0
4
1
≤
p
i
,
d
i
≤
1
0
4
0≤n≤10^41≤p_i,d_i≤10^4
0≤n≤1041≤pi,di≤104
Translate by @一只书虫仔。
输入输出样例
输入 #1
4 50 2 10 1 20 2 30 1
7 20 1 2 1 10 3 100 2 8 2 5 20 50 10
输出 #1
80
185
解题思路
贪心
先将物品进行排序,排序第一标志是时间,第二是价格
如果当前物品可购买,即购买当前物品,并将时间调到当前物品过期时间+1
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
struct DT{
int s,t;
}a[10100];
int n,ans;
bool cmp(const DT&k,const DT&l){
if(k.t==l.t)return k.s>l.s;
else return k.t<l.t;
}
int main(){
while(scanf("%d",&n)!=(EOF)){
ans=0;
for(int i=1;i<=n;i++)
scanf("%d%d",&a[i].s,&a[i].t);
sort(a+1,a+n+1,cmp);
int i=1,time=1;
while(time<=a[n].t){
if(time<=a[i].t)
ans+=a[i].s,time=a[i++].t+1;
else while(time>a[i].t)i++;
}
printf("%d\n",ans);
}
}