HDU 1789 Doing Homework again
坚持写解题报告,是总结提高,也是对自己的激励。
这道题貌似没有用到动态规划啊。
是纯贪心吧,是吧。。
定义一个结构体,先对score从大到小排序,然后对deadline从大到小二级排序。
从分值最高的作业开始,看看是否能在deadline那天或之前完成。
如果不能完成,那么这分只能丢掉。
1 #define LOCAL 2 #include <iostream> 3 #include <cstdio> 4 #include <cstring> 5 #include <algorithm> 6 using namespace std; 7 8 struct HomeWork 9 { 10 int deadline; 11 int score; 12 }homework[1010]; 13 14 bool busy[1010]; //记录第i天是否安排了作业 15 16 bool cmp(HomeWork a, HomeWork b) 17 { 18 if(a.score != b.score) 19 return (a.score > b.score); 20 return (a.deadline > b.deadline); 21 } 22 23 int main(void) 24 { 25 #ifdef LOCAL 26 freopen("1789in.txt", "r", stdin); 27 #endif 28 29 int N; 30 int LostScore; 31 scanf("%d", &N); 32 while(N--) 33 { 34 int n, i; 35 memset(busy, false, sizeof(busy)); 36 37 scanf("%d", &n); 38 for(i = 0; i < n; ++i) 39 scanf("%d", &homework[i].deadline); 40 for(i = 0; i < n; ++i) 41 scanf("%d", &homework[i].score); 42 sort(homework, homework + n, cmp); 43 44 int LostScore = 0; 45 for(i = 0; i < n; ++i) 46 { 47 int j; 48 for(j = homework[i].deadline; j > 0; --j) 49 { 50 if(!busy[j]) //如果第j天有空,那么这天完成作业i 51 { 52 busy[j] = true; 53 break; 54 } 55 } 56 if(j <= 0) //如果这次作业没有安排好,那么只能丢掉这分 57 LostScore += homework[i].score; 58 } 59 60 printf("%d\n", LostScore); 61 } 62 return 0; 63 }