画一个图分析一下就清楚啦,应该优先考虑完成损失最大的作业,因为一天只能完成一门作业,而同时应该倒着从deadline往回找合适的完成时间,因为这样对于别的作业来说,它们有更多的机会被完成。另外,deadline的数据范围也是1000以内。
1 #include <algorithm> 2 #include <iostream> 3 #include <cstring> 4 #include <cstdio> 5 using namespace std; 6 7 const int N = 1007; 8 bool visit[N]; 9 10 struct Node 11 { 12 int d, s; 13 bool operator < ( const Node & o ) const 14 { 15 return s > o.s; 16 } 17 } node[N]; 18 19 int main () 20 { 21 int t; 22 scanf("%d", &t); 23 while ( t-- ) 24 { 25 int n, sum = 0; 26 scanf("%d", &n); 27 for ( int i = 0; i < n; i++ ) 28 { 29 scanf("%d", &node[i].d); 30 } 31 for ( int i = 0; i < n; i++ ) 32 { 33 scanf("%d", &node[i].s); 34 sum += node[i].s; 35 } 36 sort( node, node + n ); 37 memset( visit, 0, sizeof(visit) ); 38 for ( int i = 0; i < n; i++ ) 39 { 40 for ( int j = node[i].d; j > 0; j-- ) 41 { 42 if ( !visit[j] ) 43 { 44 visit[j] = 1; 45 sum -= node[i].s; 46 break; 47 } 48 } 49 } 50 printf("%d\n", sum); 51 } 52 return 0; 53 }
时间: 2024-10-16 23:11:27