【贪心】Supermarket

传送门
因为没有UVA账号,所以不知道这个程序对不对

题意翻译

给定 n件物品,第 i 件物品有如下信息:

  1. 卖出去可以得到 p i p_i pi 的收益。
  2. 过期时间为 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 0n1041pi,di104
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);
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值