题意:主角打完ACM比赛回来,有一堆作业要做,每个作业有自己的deadline和score,如果不能在deadline之前完成就拿不到这个作业的分数,问主角最多能拿多少分。
题解:还是贪心策略,将作业按deadline顺序排序,用一个时间变量从前向后推,将作业逐个填入当天的内容中,如果当天的时间已经晚于该作业的deadline,就从前面的安排中找到一个可以完成该作业,且原安排的作业得分比该作业低且最少的日子来做该作业。
1 #include<iostream> 2 #include<algorithm> 3 #include<climits> 4 using namespace std; 5 struct datatype 6 { 7 int deadline; 8 int score; 9 bool choose; 10 }a[100001]; 11 bool com(const datatype& x,const datatype& y) 12 { 13 return x.deadline<y.deadline; 14 } 15 int time[100001]; 16 int main() 17 { 18 int T; 19 cin>>T; 20 for(int p=1;p<=T;p++) 21 { 22 int n; 23 cin>>n; 24 for(int i=1;i<=n;i++) 25 { 26 cin>>a[i].deadline; 27 a[i].choose=false; 28 } 29 for(int i=1;i<=n;i++) 30 { 31 cin>>a[i].score; 32 } 33 int t=0; 34 sort(a+1,a+n+1,com); 35 for(int i=1;i<=n;i++) 36 { 37 if(t+1<=a[i].deadline) 38 { 39 time[t+1]=i; 40 t+=1; 41 a[i].choose=true; 42 } 43 else 44 { 45 int tip1=a[i].score,tip2=0; 46 for(int j=1;j<=t;j++) 47 { 48 if(a[time[j]].score<a[i].score) 49 { 50 if(a[time[j]].score<tip1) 51 { 52 tip2=j; 53 tip1=a[time[j]].score; 54 } 55 } 56 } 57 if(tip2!=0) 58 { 59 a[time[tip2]].choose=false; 60 time[tip2]=i; 61 a[i].choose=true; 62 } 63 } 64 } 65 int res=0; 66 for(int i=1;i<=n;i++) 67 { 68 if(!a[i].choose) 69 { 70 res+=a[i].score; 71 } 72 } 73 cout<<res<<endl; 74 } 75 return 0; 76 }