hdu-1789 :Doing Homework again

http://acm.hdu.edu.cn/showproblem.php?pid=1789

我的思路:先在输入过程中求出总被减分数sum,再对deadline由小到大进行排序,然后找出deadline的最大值--day,从day到1依次找出deadline大于等于当前day的最大被减分数--reduce,用sum-reduce既得出最后的被减分数的最小值。

我的代码:

 1 #include <iostream>
 2 #include <stdio.h>
 3 #include <string.h>
 4 #include <algorithm>
 5 using namespace std;
 6 bool flag[1005];
 7 struct sa
 8 {
 9     int deadline;
10     int  reduce;
11 }data[1005];
12 int cmp(const sa &a,const sa &b)
13 {
14     return a.deadline<b.deadline;
15 }
16 int main()
17 {
18     int n,day,sum,t,dele,k,max_line;
19     while(cin>>t)
20     {
21         while(t--)
22         {
23             cin>>n;
24     {
25         memset(flag,0,sizeof(flag));
26         sum=0;max_line=0;
27         for(int i=0;i<n;i++)
28         {
29             cin>>data[i].deadline;
30             if(max_line<data[i].deadline)
31             max_line=data[i].deadline;
32         }
33         for(int i=0;i<n;i++)
34         {
35             cin>>data[i].reduce;
36             sum+=data[i].reduce;
37         }
38         sort(data,data+n,cmp);
39         day=max_line;
40         for(int i=day;i>=1;i--)
41         {
42             dele=0;
43             for(int j=n-1;j>=0;j--)
44             {
45                 if(data[j].deadline>=i&&data[j].reduce>dele&&flag[j]!=1)
46                 {
47                     dele=data[j].reduce;
48                     k=j;
49                 }
50                 if(data[j].deadline<i)
51                 break;
52             }
53             flag[k]=1;
54             sum-=dele;
55         }
56         cout<<sum<<endl;
57     }
58         }
59     }
60     return 0;
61 }
View Code

大神的思路:先按规则进行排序:1.扣分越多的越靠前2.扣分相同的时候,deadline越早的越靠前。找出 i-deadline之前是否有一天没写作业,如果有就完成 i-work,否则ans+= i-work。

大神的代码:

 1 #include <iostream>  
 2 #include <algorithm>  
 3 #include <cstring>  
 4 using namespace std;  
 5   
 6 struct Node  
 7 {  
 8     int time,fen;  
 9 } node[1005];  
10   
11 int cmp(struct Node a,struct Node b)  
12 {  
13     if(a.fen!=b.fen)  
14         return a.fen > b.fen;//扣分越多的越靠前  
15     return a.time < b.time;//扣分相同的时候,deadline越早的越靠前  
16 }  
17   
18 int  visit[2010];//如果当天没用过,值为0;否则为1  
19   
20 int main()  
21 {  
22     int m;  
23     cin >> m;  
24     while(m--)  
25     {  
26         int n,i,j,ans = 0;  
27         memset(visit,0,sizeof(visit));  
28         cin >> n;  
29         for(i = 0; i<n; i++)  
30         {  
31             cin >> node[i].time;  
32         }  
33         for(i = 0; i<n; i++)  
34         {  
35             cin >> node[i].fen;  
36         }  
37         sort(node,node+n,cmp);  
38         int sum = 0;  
39         for(i=0; i<n; i++)  
40         {  
41             j=node[i].time;// 从截止时间开始往前推,如果有一天没用过,这一天就做这一门课,这门课不扣分  
42             while(j)  
43             {  
44                 if(!visit[j])  
45                 {  
46                     visit[j]=1;  
47                     break;  
48                 }  
49                 j--;  
50             }  
51             if(j==0)//如果j=0,表明从time往前的每一天都被占用了,这门课完不成  
52                 ans+=node[i].fen;  
53         }  
54         cout << ans << endl;  
55     }  
56   
57     return 0;  
58 }  
View Code

 

posted @ 2016-05-30 17:27  Wally的博客  阅读(145)  评论(0编辑  收藏  举报