[贪心算法]「一本通 1.1 例 5」智力大冲浪

[一本通 1.1 例 5」智力大冲浪
P1230 智力大冲浪luogu

简洁题意:

n n n(<=500)个任务有时限 t i ti ti 与罚款 w i wi wi,初始奖励为 m m m,任务若没在限时内完成要从奖励扣下罚款。
请安排任务顺序 求出 能获得最大奖励的顺序 与 最大奖励。

题解:

由于每项任务的范围是 [ 1 , t i ] [1,t_i] [1ti]
使罚款降序,把任务在范围内从后往前按排,尽量减少冲突,留下更多空间。暴力 O ( n 2 ) O(n^2) O(n2)
安排不下直接扔到最后面

//完成一个的时间相等,从最大罚款开始
#include<cstdio>
#include<algorithm>
using namespace std;
struct node{int t,w;}a[600];
bool b[600];
bool cmp(node x,node y) { return x.w>y.w; }
int main()
{
	int m,n;
	scanf("%d %d",&m,&n);
	for(int i=1;i<=n;i++) scanf("%d",&a[i].t);
	for(int i=1;i<=n;i++) scanf("%d",&a[i].w);
	sort(a+1,a+1+n,cmp);
	
	bool flag;
	for(int i=1;i<=n;i++){
		flag=false;
		for(int j=a[i].t;j>=1;j--)
		{//尽量往后放 
			if(!b[j]) {
				b[j]=true;
				flag=true;
				break;
			}
		}
		if(!flag)
		{
			for(int j=n;j>=1;j--)
			{//扔到最后面
				if(!b[j]) {
					b[j]=true;
					break;
				}
			}m-=a[i].w;
		}
	}printf("%d",m);
	return 0;
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值