【HDOJ】1789 Doing Homework again
其实也不是DP啊,贪心策略就决绝了。
1 #include <stdio.h> 2 #include <string.h> 3 #include <stdlib.h> 4 5 #define MAXNUM 1005 6 7 typedef struct { 8 int dead, reduce; 9 } work_st; 10 11 work_st works[MAXNUM]; 12 char visit[MAXNUM]; 13 14 int comp(const void *a, const void *b) { 15 work_st *p = (work_st *)a; 16 work_st *q = (work_st *)b; 17 if (p->reduce == q->reduce) 18 return p->dead>q->dead ? 1:-1; 19 else 20 return p->reduce>q->reduce ? -1:1; 21 } 22 23 int main() { 24 int case_n, n, reduce; 25 int i, j, k, dead; 26 27 scanf("%d", &case_n); 28 29 while (case_n--) { 30 scanf("%d", &n); 31 for (i=0; i<n; ++i) 32 scanf("%d", &works[i].dead); 33 for (i=0; i<n; ++i) 34 scanf("%d", &works[i].reduce); 35 qsort(works, n, sizeof(work_st), comp); 36 memset(visit, 0, sizeof(visit)); 37 reduce = 0; 38 k = n; 39 for (i=0; i<n; ++i) { 40 dead = works[i].dead; 41 for (j=dead; j>0; --j) 42 if ( !visit[j] ) 43 break; 44 if (j) { 45 visit[j] = 1; 46 } else { 47 for (j=k; j>0; --j) 48 if ( !visit[j] ) 49 break; 50 visit[j] = 1; 51 k = j; 52 reduce += works[i].reduce; 53 } 54 } 55 printf("%d\n", reduce); 56 } 57 58 return 0; 59 }
浙公网安备 33010602011771号