利用貪心策略,以及枚舉ios
枚舉在前n個湖中選擇,這樣總時間h中分出固定一部分用於走遍前n個湖優化
這就像延遲記錄的技巧,排除在前n個湖走遍的時間,以後的問題就能夠轉化爲你能夠在這n個湖中任意選擇了spa
中間能夠利用最大隊優化,此處略過code
#include <iostream> #include <cstdio> #include <algorithm> #include <cstring> using namespace std; const int maxh= 20; const int maxn= 25+3; const int INF= 0X7f7f7f7f; int fi[maxn], di[maxn], ti[maxn], pln[maxn]; int ans; inline void Init() { memset(ti, 0, sizeof(ti)); memset(pln, 0, sizeof(pln)); ans= -INF; } void Copy(int bnd, int *src, int *dst) { for (int i= 1; i<= bnd; ++i){ dst[i]= src[i]; } } void OutAns(const int n) { for (int i= 1; i<= n; ++i){ printf("%d", pln[i]); if (n!= i){ printf(", "); } } putchar('\n'); printf("Number of fish expected: %d\n\n", ans); } int main() { int h, n, tph; int tpfi[maxn], tppl[maxn]; while (EOF!= scanf("%d", &n) && n){ scanf("%d", &h); Init(); for (int i= 1; i< n+1; ++i){ scanf("%d", fi+i); } for (int i= 1; i< n+1; ++i){ scanf("%d", di+i); } for (int i= 1; i< n; ++i){ scanf("%d", ti+i); ti[i]+= ti[i-1]; } int lake; for (int i= 1; i< n+1; ++i){ tph= h*60- 5*ti[i-1]; int tpas= 0; Copy(i, fi, tpfi); memset(tppl, 0, sizeof(tppl)); while (tph> 4){ int maxfi= 0; for (int j= 1; j<= i; ++j){ if (tpfi[j]> maxfi){ lake= j; maxfi= tpfi[lake]; } } if (maxfi<= 0){ break; } tph-= 5; tppl[lake]+= 5; tpas+= maxfi; tpfi[lake]= maxfi> di[lake] ? tpfi[lake]-di[lake] : 0; } if (tpas> ans){ ans= tpas; Copy(i, tppl, pln); pln[1]+= tph; } } OutAns(n); } return 0; }