给你几个任务点的期限和罚分
如何最小化总罚分
按罚时排序,再按日期排序,贪心的方法:这题我一开始想要从a[i]的位置往后找(比较deal和vim),后来发现特别不好实现,所以后来变成a[i]的日期作为桶,往前找可行的日期,一找到就标记,这个贪心我也不知道为什么成立。。。。
#include<iostream>
#include<string.h>
#include<string>
#include<cmath>
#include<algorithm>
#include<cstdio>
#define mem(x,y) memset(x,y,sizeof(x))
using namespace std;
struct node{
int deal,vim;
}a[1005];
bool cmp(node a,node b){
if(a.vim==b.vim)return a.deal<b.deal;
return a.vim>b.vim;
}
bool book[1005];
int main(){
int t,n,m;
scanf("%d",&t);
while(t--){
scanf("%d",&n);
mem(book,false);
for(int i=0;i<n;i++){
scanf("%d",&a[i].deal);
}
for(int i=0;i<n;i++){
scanf("%d",&a[i].vim);
}
sort(a,a+n,cmp);
int i,j,sum=0;
for(i=0;i<n;i++){
for(j=a[i].deal;j>0;j--){
//之前有任意一天可以用于第i个任务上
if(!book[j]){
book[j]=true;
break;
}
}
//之前没有了必须加上sum
if(j==0)sum+=a[i].vim;
}
printf("%d\n",sum);
}
return 0;
}