PKU 1042 Gone Fishing 解题报告(枚举 + 贪心)

来源:互联网 发布:校园网络管理方案 编辑:程序博客网 时间:2024/05/17 22:48

PKU 1042 Gone Fishing  解题报告(枚举 + 贪心)

对于这道题,关键是理解题意。

题意:有n个湖在沿着一条直线分布着(1,2,3,4……n),一个人将花h个小时从第1个湖出发,沿着这条路钓鱼,用t[i](1 <= i < n)表示从第i个湖走到第i + 1个湖所花的时间,如果他要在第i个湖钓鱼,每次垂钓时间为5分钟,所能钓到的鱼数为: (1)d[i](d[i] <= f[i])(2)f[i](f[i] <= d[i])(3)0(f[i] = 0)  f[i]表示第i个湖鱼的数量,f[i]随着在该湖的垂钓次数的时间而递减,每次递减量为该次的钓鱼量。(注:假设垂钓者到达最远到达第i湖垂钓,则各相邻湖的距离只算一次.)

解法:枚举 + 贪心

我们每次枚举垂钓者最远到达第i(1 <= i <= n)个湖垂钓,则best[i]表示此状态下最优的钓鱼数,而在此状态下,垂钓者的垂钓次数为12 * h - ∑t[j] (1 <= j < i),每次选择当前某个湖所能钓到的鱼数进行垂钓,就能得到best[i]。

则最终答案为ans = max(best[i]) (1 <= i <= n)(当有多个最优解时,按stay[i](在第i个湖垂钓的次数)依次比较,先比较这些最优解的stay[1],取stay[1]最大的方案,若stay[1]都相同,则比较stay[2],依此类推)

 源代码:

#include <iostream>
#include <algorithm>
using namespace std;
const int MAXN = 26;
int f[MAXN], d[MAXN], t[MAXN];
struct Lake {
     int f, i;
     bool operator < (const Lake & l)const {
         if(l.f != f) return f < l.f;
         return i > l.i;
     }
}lake[MAXN];
int main()
{
      int n, h, maxfish, sum;
      int s[MAXN], stay[MAXN];
      while(cin >> n && n) {
            int i, j, h;
            cin >> h;
            h *= 12;
            for(i = 1; i <= n; i++)   cin >> f[i];
            for(i = 1; i <= n; i++)   cin >> d[i];
            for(i = 1; i <= n-1; i++) cin >> t[i];
            maxfish = -1;
            for(i = 1; i <= n; i++) {
                  sum = 0;
                  memset(s, 0, sizeof(s));
                  for(j = 1; j <= i; j++) {
                       lake[j-1].f = f[j];
                       lake[j-1].i = j;
                  }
                  make_heap(lake, lake + i);
                  for(int tm = 1; tm <= h; tm ++) {
                       pop_heap(lake, lake + i);
                       int lake_f = lake[i-1].f;
                       int lake_i = lake[i-1].i;
                       sum += lake_f;
                       s[lake_i] ++;
                       lake[i-1].f = (lake_f - d[lake_i] > 0) ? (lake_f - d[lake_i]) : 0;
                       push_heap(lake, lake + i);
                  }
                  if(sum > maxfish) {
                       maxfish = sum;
                       memcpy(stay, s, sizeof(s));
                   }
                  h -= t[i];
            }
            for(i=1;i<=n-1;i++)
                 cout << stay[i] * 5 << ", ";
            cout << stay[n] * 5 <<endl;
            cout << "Number of fish expected: " << maxfish << endl << endl;
      }
      return(0);
}

原创粉丝点击