题意:主角打完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 }