题目:uva757 - Gone Fishing(贪心)

题目大意:有N个湖泊仅仅有一条通路将这些湖泊相连。

每一个湖泊都会给最開始5分钟间隔内能够调到的鱼(f)。然后给每过5分钟降低的鱼的数量(d),假设当前的鱼少于等于降低的数量,说明在下个5分钟没有鱼。还有过每条道路的所要耗费的时间(N-1),时间都是以5分钟为单位的。渔者能够在随意一个湖泊钓鱼,可是起始位置是在湖泊1。问H小时后,渔者如何合理的在每一个湖泊分配时间,能够得到的鱼最多。

假设得到最多的鱼的方式有多种,则取在前面的湖泊耗时最久的那一种。

解题思路:由于这些湖泊是由一条通路串起来的。这样就意味着经过湖泊3,那么的先经过湖泊2。

所以这里先枚举钓鱼的终点i。这样在路上耗费的时间就能够确定了。然后在0 - i这些湖泊中以f最大的排序。每次取都是f取最多的,直到和这个湖泊的鱼降低到和第二个大的f相等或者更小。这里有个注意点。两个湖泊假设f同样的话。应该先选比較前面的湖泊。

然后再进行排序。反复这些操作直到时间耗尽,或是没有湖泊有鱼。

这样就可能存在时间没实用完的情况。这个时候随意的湖泊都是没有鱼的,在哪个湖泊呆着都是一样的,可是由于要求的前面的湖泊耗时多,所以剩下的时间就都给湖泊1。

最后统计鱼的时候,大于当前的最大值自然要保存这样的分配方式,可是等于的话,就须要选择前面湖泊耗时较大的那种。

计算鱼的数量时候要细心。

代码:

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <algorithm>
  4. using namespace std;
  5.  
  6. const int N = 30;
  7. int h, n;
  8. int t[N];
  9. typedef long long ll;
  10. ll fish;
  11.  
  12. struct Lake {
  13.  
  14. int i;
  15. ll f;
  16. int d;
  17. int hour;
  18. }l[N], l1[N];
  19.  
  20. int cmp (const Lake &a, const Lake &b) {
  21. if (a.f == b.f)
  22. return a.i < b.i;
  23. return a.f > b.f;
  24. }
  25.  
  26. int cmp1 (const Lake &a, const Lake &b) { return a.i < b.i; }
  27.  
  28. void init () {
  29.  
  30. h *= 12;
  31. fish = -1;
  32. for (int i = 0; i < n; i++)
  33. l[i].hour = 0;
  34. }
  35.  
  36. bool judge (int num, int newh) { //同样鱼的数目的时候比較选择哪种方案
  37.  
  38. sort (l1, l1 + num + 1, cmp1);
  39. l1[0].hour += newh;
  40. for (int i = 0; i <= num; i++)
  41. if (l1[i].hour != l[i].hour)
  42. return l1[i].hour > l[i].hour;
  43. return false;
  44. }
  45.  
  46. void solve () {
  47.  
  48. init ();
  49. int newh;
  50. int k, max_day;
  51. ll sum;
  52.  
  53. for (int i = 0; i < n; i++) { //枚举终点
  54.  
  55. newh = h;
  56. for (int j = 0; j <= i; j++) {
  57.  
  58. l1[j].i = l[j].i;
  59. l1[j].f = l[j].f;
  60. l1[j].d = l[j].d;
  61. l1[j].hour = 0;
  62. }
  63.  
  64. for (int j = 0; j <= i - 1; j++) //路上要耗费的时间
  65. newh -= t[j];
  66. if (newh <= 0)
  67. continue; //到达不了直接下一种方案
  68.  
  69. if (i == 0) {
  70.  
  71. l1[i].hour += newh;
  72. newh = 0;
  73. }
  74.  
  75. while (newh > 0 && i) { //找f最大的湖泊
  76.  
  77. sort (l1, l1 + i + 1 , cmp);
  78. if (l1[0].f == 0)
  79. break;
  80. if (l1[0].d != 0) {
  81.  
  82. if (l1[0].f == l1[0].f)
  83. k = 1;
  84. else {
  85.  
  86. k = (l1[0].f - l1[1].f) / l1[0].d;
  87. if ((l1[0].f - l1[1].f) % l1[0].d)
  88. k++;
  89. }
  90. }
  91. else
  92. k = newh; //假设d等于0说明这里的鱼不会降低。自然剩下的时间都耗费在这里最合理。
  93.  
  94. if (newh - k < 0)
  95. k = newh;
  96. newh -= k;
  97. l1[0].f -= k * l1[0].d; //更新f和这个湖泊的耗时
  98. if (l1[0].f < 0)
  99. l1[0].f = 0;
  100. l1[0].hour += k;
  101. }
  102.  
  103. sum = 0;
  104. for (int j = 0; j <= i; j++) { //计算鱼的数目
  105.  
  106. k = l1[j].i;
  107. if (!l1[j].hour)
  108. continue;
  109. if (l[k].d == 0) {
  110.  
  111. sum += l[k].f * l1[j].hour;
  112. continue;
  113. }
  114. max_day = l[k].f/ l[k].d;
  115. if (l[k].f % l[k].d != 0)
  116. max_day++;
  117. if (l1[j].hour <= max_day)
  118. max_day = l1[j].hour;
  119. l1[j].f = l[k].f - (max_day - 1) * l[k].d;
  120. sum += (l[k].f + l1[j].f) * max_day / 2;
  121.  
  122. }
  123.  
  124. if (sum > fish || (sum == fish && judge(i, newh))) { //维护最大值
  125.  
  126. fish = sum;
  127. for (int j = 0; j <= i; j++) {
  128.  
  129. if (l1[j].i == 0)
  130. l[0].hour = l1[j].hour + newh;
  131. else
  132. l[l1[j].i].hour = l1[j].hour;
  133. }
  134. }
  135. }
  136. }
  137.  
  138. int main () {
  139.  
  140. bool flag = 0;
  141. while (scanf ("%d", &n) && n) {
  142.  
  143. if (flag)
  144. printf ("\n");
  145. flag = 1;
  146. scanf ("%d", &h);
  147. for (int i = 0; i < n; i++)
  148. scanf ("%lld", &l[i].f);
  149. for (int i = 0; i < n; i++)
  150. scanf ("%d", &l[i].d);
  151. for (int i = 0; i < n - 1; i++)
  152. scanf ("%d", &t[i]);
  153. for (int i = 0; i < n; i++)
  154. l[i].i = i;
  155.  
  156. solve();
  157. printf ("%d", l[0].hour * 5);
  158. for (int i = 1; i < n; i++)
  159. printf (", %d",l[i].hour * 5);
  160. printf ("\n");
  161. printf ("Number of fish expected: %lld\n", fish);
  162. }
  163. return 0;
  164. }

版权声明:本文博主原创文章,博客,未经同意不得转载。

uva757 - Gone Fishing(馋)的更多相关文章

  1. ZOJ 1015 Fishing Net(弦图判定)

    In a highly modernized fishing village, inhabitants there make a living on fishery. Their major tool ...

  2. bzoj 1242: Zju1015 Fishing Net 弦图判定

    1242: Zju1015 Fishing Net弦图判定 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 214  Solved: 81[Submit ...

  3. Poj/OpenJudge 1042 Gone Fishing

    1.链接地址: http://bailian.openjudge.cn/practice/1042/ http://poj.org/problem?id=1042 2.题目: Gone Fishing ...

  4. POJ 1042 Gone Fishing (贪心)(刘汝佳黑书)

    Gone Fishing Time Limit: 2000MS   Memory Limit: 32768K Total Submissions: 30281   Accepted: 9124 Des ...

  5. ●BZOJ 1006 [HNOI2008]神奇的国度(弦图最小染色数)○ZOJ 1015 Fishing Net

    ●赘述题目 给出一张弦图,求其最小染色数. ●题解 网上的唯一“文献”:<弦图与区间图>(cdq),可以学习学习.(有的看不懂) 摘录几个解决改题所需的知识点: ●子图和诱导子图(一定要弄 ...

  6. Cocos2d-X开发教程-捕鱼达人 Cocos2-x development tutorial - fishing talent

    Cocos2d-X开发教程-捕鱼达人 Cocos2-x development tutorial - fishing talent 作者:韩梦飞沙 Author:han_meng_fei_sha 邮箱 ...

  7. CSU 1859 Gone Fishing(贪心)

    Gone Fishing [题目链接]Gone Fishing [题目类型]贪心 &题解: 这题要先想到枚举走过的湖,之后才可以贪心,我就没想到这,就不知道怎么贪心 = = 之后在枚举每个湖的 ...

  8. Gone Fishing(贪心)

    Gone Fishing John is going on a fising trip. He has h hours available (1 ≤ h ≤ 16), and there are n ...

  9. LightOJ1106 Gone Fishing

    Gone Fishing John is going on a fishing trip. He has h hours available, and there are n lakes in the ...

随机推荐

  1. 【Linux探索之旅】第二部分第一课:终端Terminal,好戏上场

    内容简介 1.第二部分第一课:终端Terminal,好戏上场 2.第二部分第二课预告:命令行,世界尽在掌握 终端Terminal,好戏上场 随着第一部分的结束,我们进入了第二部分(小编你这好像是废话. ...

  2. [LeetCode141]Linked List Cycle

    题目:Given a linked list, determine if it has a cycle in it. 判断一个链表是否有环 代码: /** * Definition for singl ...

  3. 简单的dialog菜单

    本文介绍的是我自己做的一个简单的dialog菜单,可以直接植入到类中. 方法代码: /** 显示一个靠右上的dialog列表菜单*/private void showTopBarRightButton ...

  4. JavaScript IDE

    哪些JavaScript IDE最好用?   阅读本文之前,分享大家一张图片,看图会发现JavaScript开发需求最高,占比达到42.84%,因此掌握JavaScript语言好工作就不愁啦,工欲善其 ...

  5. Codeforces 451E Devu and Flowers(容斥原理)

    题目链接:Codeforces 451E Devu and Flowers 题目大意:有n个花坛.要选s支花,每一个花坛有f[i]支花.同一个花坛的花颜色同样,不同花坛的花颜色不同,问说能够有多少种组 ...

  6. Redis实现分布式锁与任务队列

    Redis实现分布式锁 与 实现任务队列 这一次总结和分享用Redis实现分布式锁 与 实现任务队列 这两大强大的功能.先扯点个人观点,之前我看了一篇博文说博客园的文章大部分都是分享代码,博文里强调说 ...

  7. SQLSERVER中的log block校验(译)

    原文:SQLSERVER中的log block校验(译) SQLSERVER中的log block校验(译) 来自:http://sankarreddy.com/2010/03/transaction ...

  8. Windows在生产体系Android开关机动画

    在Windows根据系统.办Android开关机动画,几个需要注意的问题: 1.压缩的选择 2.压缩的格式: 版权声明:本文博客原创文章,博客,未经同意,不得转载.

  9. 漫话Unity3D(三)

    八.预制(Prefab) 这个单独提出来,是由于它太经常使用了.也是Unity 的核心要素之中的一个.原本Unity中的一个物体是你拖拽一个模型到场景中,或者创建一个几何体,或者灯光地形等,然后设置这 ...

  10. SQLServer RESOURCE_SEMAPHORE 等待状态

    原文:SQLServer RESOURCE_SEMAPHORE 等待状态 概述: 当一个SQLServer实例运行得很慢的时候,应该做一些检查,如检查等待状态.最好的方法是一开始就建立一个性能基线,以 ...