这个题 第一问应该可以想出,第二问以前也做过类似的贪心,两问组合起来,就是理解不来题意,不知如何下手了,看题解后,唉。。。
第一问有点DP思想,第二问求max(cosa[i] + cosb[n-i+1])。
1 /* 2 ID: cuizhe 3 LANG: C++ 4 TASK: job 5 */ 6 #include <cstdio> 7 #include <cstring> 8 #include <cmath> 9 #include <string> 10 using namespace std; 11 #define INF 0x7fffffff 12 int dpa[101],dpb[101],cosa[1001],cosb[1001]; 13 int a[101],b[101]; 14 int main() 15 { 16 int n,m1,m2,i,j,minz,key,maxz; 17 freopen("job.in","r",stdin); 18 freopen("job.out","w",stdout); 19 scanf("%d%d%d",&n,&m1,&m2); 20 for(i = 1;i <= m1;i ++) 21 scanf("%d",&a[i]); 22 for(i = 1;i <= m2;i ++) 23 scanf("%d",&b[i]); 24 for(i = 1;i <= n;i ++) 25 { 26 minz = INF; 27 for(j = 1;j <= m1;j ++) 28 { 29 if(minz > dpa[j] + a[j]) 30 { 31 minz = dpa[j] + a[j]; 32 key = j; 33 } 34 } 35 dpa[key] = minz; 36 cosa[i] = minz; 37 minz = INF; 38 for(j = 1;j <= m2;j ++) 39 { 40 if(minz > dpb[j] + b[j]) 41 { 42 minz = dpb[j] + b[j]; 43 key = j; 44 } 45 } 46 dpb[key] = minz; 47 cosb[i] = minz; 48 } 49 maxz = -INF; 50 for(i = 1;i <= n;i ++) 51 { 52 if(maxz < cosa[i] + cosb[n-i+1]) 53 maxz = cosa[i] + cosb[n-i+1]; 54 } 55 printf("%d %d\n",cosa[n],maxz); 56 return 0; 57 }