题目的意思就是:
首先输入有几个池塘;
然后输入你有几个小时的时间。
然后输入一行,每个池塘 5 分钟能钓到几只鱼。
再输入一行,每个池塘下一个5分钟会比上一次少钓多少鱼
最后一行输入到下一个池塘所要的时间(n个池塘减有n - 1条路,多以比池塘数少了一)。(注意这里的1代表5分钟)
输出就是每个池塘呆了多少时间。(注意这里的时间是分钟)
还有总共几只鱼。
做法就是假设,这个人只在第一个池塘钓鱼,最多能钓多少,在假设在1,2,两个池塘钓鱼最多能钓多少,一只假设到在全部池塘钓鱼最多能钓到多少,取最大值。
那么怎么算他最多能钓多少呢。拿只在1,2.3池塘钓鱼举例。
那么要在一开始把中间要走的两段路时间减掉。那么我们就可以当做他在三个池塘间走来走去都不花时间了。
因为假如你在第一个池塘钓一只,再到第二个池塘钓一只,再到第三个池塘钓一只,然后又回到第一个池塘钓一只。
所得到的结果和在第一个池塘钓两只,在到后面两个各钓一只是一样。。而后面那种情况消耗在路上的时间永远只是算一次。。
所以我们在算他在1 到 n个池塘钓鱼的情况是,先把路上的小号减完。然后每次都取能钓到的鱼最多的池塘钓,(可以每次都排序,能后取最大的,然后把最大的那个减掉它会减少的数量后,再找那个最大了,因为我们可以忽略路上的时间了,每个池塘间移动不需要考虑时间);
要注意以下几点:
鱼的数量一样,我们要取靠前的池塘时间多的方案。
可以把所有时间化成单位时间做,也就是5分钟,输入1小时,那么就是有12个单位时间,每次钓鱼消耗一个单位时间,移动的时间本来就是以单位时间的数量输入的。然后输出每个池塘呆多久时,乘以5输出。
如果一个池塘下次能钓到的鱼的数量小于0了,要把他化为0,总不能钓负数只。
排序是直接按下次能钓到几条鱼排序,能钓到的一样多时,序号小的池塘排前面。。
AC代码:
#include<iostream>
#include<algorithm>
#include<string.h>
using namespace std;
const int N = 30 ;
struct fish {
int id;
int num;
int d;
}f[N],f2[N];
int t[N];
int h;
int hour;
int lake;
int id[N];
int res[N];
int cmp (fish a ,fish b) {
if(a.num != b.num)
return a.num > b.num;
if(a.num == b.num)
return a.id < b.id;
}
int main () {
int cas = 0;
while (cin >> lake && lake) {
memset(res , 0 ,sizeof(res));
if(cas++)
cout << endl;
memset(id , 0 ,sizeof(id));
cin >> hour;
hour = hour * 12;
h = hour;
t[0] = 0;
for (int i = 0 ; i < lake;i++) {
cin >> f[i].num;
f[i].id = i;
}
for (int i = 0 ; i < lake ;i++) {
cin >> f[i].d;
}
for (int i = 1 ; i < lake ;i++) {
cin >> t[i];
}
int m = 0;
for (int i = 0 ; i < lake ;i++) {
hour = hour - t[i];
h = hour;
memset(id , 0 ,sizeof(id));
for (int k = 0 ; k <= i ;k++) {
f2[k].num = f[k].num;
f2[k].id = f[k].id ;
f2[k].d = f[k].d;
}
int sumt = 0;
int sum = 0;
for(int j = 0 ; j <= i ;j++) {
sumt += t[j];
}
// cout <<"h "<< h << endl;
// cout <<"i "<< i << endl <<endl;
if (h < 0)
break;
while (h > 0) {
sort(f2 , f2 + i + 1 ,cmp);
sum += f2[0].num;
id[f2[0].id]++;
// cout << f2[0].num <<endl;
// cout << f2[1].num <<endl;
f2[0].num -= f2[0].d;
if (f2[0].num < 0) {
f2[0].num = 0 ;
}
h -= 1;
}
if (sum == m) {
for (int k = 0 ; k < lake ;k++) {
if (res[k] > id[k])
break;
if (id[k] > res[k]) {
for (int w = 0 ; w < lake ;w++) {
res[w] = id[w];
}
break;
}
}
}
if (sum > m) {
m = sum ;
for (int w = 0 ; w < lake ;w++) {
res[w] = id[w];
}
}
}
for (int i = 0 ; i < lake ;i++) {
if(i)
cout << ", ";
cout << res[i] * 5 ;
}
cout <<endl;
cout << "Number of fish expected: " << m << endl;
}
}