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 }
大神的思路:先按规则进行排序: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 }