[一本通 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]
[1,ti]
使罚款降序,把任务在范围内从后往前按排,尽量减少冲突,留下更多空间。暴力
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;
}