蓝桥集训之鱼塘钓鱼
-
核心思想:多路归并
- 人不会在鱼塘间往返浪费时间
- 将每个鱼塘的取值列出 想要最多鱼 就是每次在最顶上取最大
- 注意:找最大的顺序和实际钓鱼的顺序不同
- 先在一个坑钓完再去另一个
-
#include <iostream> #include <cstring> #include <algorithm> using namespace std; const int N = 110; int a[N],d[N],l[N],spend[N]; int get(int k) { return max(0,a[k] - d[k] * spend[k]); //剩多少鱼 } int work(int n,int T) { int res=0; memset(spend,0,sizeof spend); //每一种方案都不同 置空 for(int i=0;i<T;i++) //T为钓鱼时间 { int t = 1; //第一个坑开始 for(int j=2;j<=n;j++) //找最大 n为最远的坑 if(get(t)<get(j)) t = j; res += get(t); spend[t] ++; //在t坑钓鱼时间+1 } return res; } int main() { int n,T; cin>>n; for (int i = 1; i <= n; i ++ ) scanf("%d", &a[i]); for (int i = 1; i <= n; i ++ ) scanf("%d", &d[i]); for(int i = 2;i<=n;i++) { cin>>l[i]; l[i] += l[i-1]; } cin>>T; int res=0; for(int i=1;i<=n;i++) { res = max(res, work(i,T - l[i])); //传值为 最远坑,剩下的钓鱼时间 } cout<<res<<endl; return 0; }