经典的贪心问题,先按照作业的扣除分数从大到小排序,如果分数相同则按截至日期从小到大排序。然后根据day判断哪些作业可以被安排。注意:for循环中如果存在一个作业符合条件就要跳出循环(因为每天只能安排一个作业)。
C++代码:
#include<stdio.h>
#include<algorithm>
using namespace std;
const int N=1001;
struct homework{
int deadline,reduce;
bool flag;
}arr[N];
bool cmp(homework a,homework b){
if(a.reduce==b.reduce)
return a.deadline<b.deadline;
return a.reduce>b.reduce;
}
int main(){
int T;//freopen("1.txt","r",stdin);
scanf("%d",&T);
while(T--){
int day=0,n;
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%d",&arr[i].deadline);
if(arr[i].deadline>day)
day=arr[i].deadline;
}
int s=0;
for(int i=0;i<n;i++){
scanf("%d",&arr[i].reduce);
s+=arr[i].reduce;
arr[i].flag=false;
}
sort(arr,arr+n,cmp);
int sum=0;
while(day){
for(int i=0;i<n;i++){
if(arr[i].deadline>=day&&arr[i].flag==false){
arr[i].flag=true;
sum+=arr[i].reduce;
break;
}
}
day--;
}
printf("%d\n",s-sum);
}
return 0;
}