题目:uva757 - Gone Fishing(贪心)

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

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

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

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

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

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

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

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

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

代码:

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std; const int N = 30;
int h, n;
int t[N];
typedef long long ll;
ll fish; struct Lake { int i;
ll f;
int d;
int hour;
}l[N], l1[N]; int cmp (const Lake &a, const Lake &b) {
if (a.f == b.f)
return a.i < b.i;
return a.f > b.f;
} int cmp1 (const Lake &a, const Lake &b) { return a.i < b.i; } void init () { h *= 12;
fish = -1;
for (int i = 0; i < n; i++)
l[i].hour = 0;
} bool judge (int num, int newh) { //同样鱼的数目的时候比較选择哪种方案 sort (l1, l1 + num + 1, cmp1);
l1[0].hour += newh;
for (int i = 0; i <= num; i++)
if (l1[i].hour != l[i].hour)
return l1[i].hour > l[i].hour;
return false;
} void solve () { init ();
int newh;
int k, max_day;
ll sum; for (int i = 0; i < n; i++) { //枚举终点 newh = h;
for (int j = 0; j <= i; j++) { l1[j].i = l[j].i;
l1[j].f = l[j].f;
l1[j].d = l[j].d;
l1[j].hour = 0;
} for (int j = 0; j <= i - 1; j++) //路上要耗费的时间
newh -= t[j];
if (newh <= 0)
continue; //到达不了直接下一种方案 if (i == 0) { l1[i].hour += newh;
newh = 0;
} while (newh > 0 && i) { //找f最大的湖泊 sort (l1, l1 + i + 1 , cmp);
if (l1[0].f == 0)
break;
if (l1[0].d != 0) { if (l1[0].f == l1[0].f)
k = 1;
else { k = (l1[0].f - l1[1].f) / l1[0].d;
if ((l1[0].f - l1[1].f) % l1[0].d)
k++;
}
}
else
k = newh; //假设d等于0说明这里的鱼不会降低。自然剩下的时间都耗费在这里最合理。 if (newh - k < 0)
k = newh;
newh -= k;
l1[0].f -= k * l1[0].d; //更新f和这个湖泊的耗时
if (l1[0].f < 0)
l1[0].f = 0;
l1[0].hour += k;
} sum = 0;
for (int j = 0; j <= i; j++) { //计算鱼的数目 k = l1[j].i;
if (!l1[j].hour)
continue;
if (l[k].d == 0) { sum += l[k].f * l1[j].hour;
continue;
}
max_day = l[k].f/ l[k].d;
if (l[k].f % l[k].d != 0)
max_day++;
if (l1[j].hour <= max_day)
max_day = l1[j].hour;
l1[j].f = l[k].f - (max_day - 1) * l[k].d;
sum += (l[k].f + l1[j].f) * max_day / 2; } if (sum > fish || (sum == fish && judge(i, newh))) { //维护最大值 fish = sum;
for (int j = 0; j <= i; j++) { if (l1[j].i == 0)
l[0].hour = l1[j].hour + newh;
else
l[l1[j].i].hour = l1[j].hour;
}
}
}
} int main () { bool flag = 0;
while (scanf ("%d", &n) && n) { if (flag)
printf ("\n");
flag = 1;
scanf ("%d", &h);
for (int i = 0; i < n; i++)
scanf ("%lld", &l[i].f);
for (int i = 0; i < n; i++)
scanf ("%d", &l[i].d);
for (int i = 0; i < n - 1; i++)
scanf ("%d", &t[i]);
for (int i = 0; i < n; i++)
l[i].i = i; solve();
printf ("%d", l[0].hour * 5);
for (int i = 1; i < n; i++)
printf (", %d",l[i].hour * 5);
printf ("\n");
printf ("Number of fish expected: %lld\n", fish);
}
return 0;
}

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

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. Android搜索芽发展clientVersion1.0结束(过程和结果显示)

    本文原:http://blog.csdn.net/minimicall 转载标明. 博士生.找我,我希望有一个合作伙伴.为了帮助他解决了移动终端产品.他给了我他的想法的叙述性说明,搜索布.要搜索布图像 ...

  2. C# winForm里窗体嵌套

    ShowAllPage sAllPage = new ShowAllPage();            sAllPage.FormBorderStyle = FormBorderStyle.None ...

  3. 【C语言探索之旅】 第二部分第四课:字符串

    内容简介 1.课程大纲 2.第二部分第四课: 字符串 3.第二部分第五课预告: 预处理 课程大纲 我们的课程分为四大部分,每一个部分结束后都会有练习题,并会公布答案.还会带大家用C语言编写三个游戏. ...

  4. 输入n个数和输出调整后的n个数

    输入n个数和输出调整后的n个数 Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 148  Solved: 118 [Submit][Status][We ...

  5. JavaScipt面向对象编程----闭包

    在javascript中闭包是一个非常不好理解的概念,可是确实一个不可逃避的东西,那么今天我们就来一起学习一下闭包. 什么是闭包? 闭包:官方"的解释是:闭包是一个拥有很多变量和绑定了这些变 ...

  6. MyEclipse—怎样在MyEclipse中创建servlet3.0

    servlet3.0随着Java EE6规范一起公布,那么怎样在MyEclipse中创建3.0版的servlet呢? 1.启动MyEclipse.获得下图: 2.点击上图"File" ...

  7. 【七】注入框架RoboGuice使用:(Your First Custom Binding)

    上一篇我们简单的介绍了一下RoboGuice的使用([六]注入框架RoboGuice使用:(Singletons And ContextSingletons)),今天我们来看下自己定义绑定(bindi ...

  8. JSP_include指令和&lt;jsp:include&gt;

    包括三个文件:jsp_include.jsp, static.html, two.jsp 周边环境:tomcat7.0. myeclipse10 1.jsp_include.jsp <%@ pa ...

  9. C#依据word模版动态生成文档

    新生开学,各院系辅导员代领校园卡.需要打印一份领取卡的协议,协议模版固定,但各院系卡的数量不同.需要从excel表格中抽取数据往word文件中填,同事咨询是否可以用word中的邮件合并功能,心想有这功 ...

  10. [Cocos2d-x]Mac下cocos2d-x连接pomeloserver

    Pomelo 是由网易开发的基于node.js 开发的高性能.分布式游戏server框架, 也可作为高实时web应用框架. Polemo的配置这里就不赘述了,Github的wiki非常全面. 在此记录 ...