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 }
代码君

 

你可能感兴趣的:(home)