反省
1.理解“瞬移”的意思。
2.恰当使用c++ stl和数据结构,简化代码。
3.有时候题目思路正确,并不需要考虑到太多的特例,吓唬自己。
#include <stdio.h>
#include <string.h>
#include <queue>
using namespace std;
struct
Lake {
int id, f, d;
// 按湖里鱼数从大到小排,需重载 '<'
// 鱼数相等,id小的湖优先
friend bool operator < (Lake a, Lake b) { // friend不能够少
if( a.f == b.f ) {
return a.id > b.id;
}
return a.f < b.f;
}
};
#define maxn 30
Lake lake[maxn];
Lake temp;
int t[maxn]; // 每两池塘之间的路径长度
int lake_fishing_time[maxn][maxn]; // [i][j]: 以某个湖i为终点,在每个湖j钓鱼的时间
int
main() {
int n, h, ans, maxans, maxk, t_on_road, t_on_fishing, i, j;
while( scanf("%d", &n) && n ) {
scanf("%d", &h);
h *= 12; // 1小时有12个5分钟
for( i = 1; i <= n; i++ ) {
scanf("%d", &lake[i].f);
lake[i].id = i;
}
for( i = 1; i <= n; i++ ) {
scanf("%d", &lake[i].d);
}
for( i = 1; i <= n - 1; i++ ) {
scanf("%d", &t[i]);
}
memset(lake_fishing_time, 0, sizeof(lake_fishing_time));
maxans = 0;
maxk = 1;
for( i = 1; i <= n; i++ ) { // 枚举所有湖为终点的情况
t_on_road = 0;
for( j = 1; j < i; j++ ) { // j < i,在第一个湖钓鱼不需要走路
t_on_road += t[j];
}
priority_queue <Lake> pq;
for( j = 1; j <= i; j++ ) {
pq.push(lake[j]);
}
ans = 0;
t_on_fishing = h - t_on_road;
for( j = 1; j <= t_on_fishing; j++ ) {
temp = pq.top();
pq.pop();
ans += temp.f;
lake_fishing_time[i][temp.id] += 5;
pq.push(Lake{temp.id, max(temp.f - temp.d, 0), temp.d});
}
if( ans > maxans ) {
maxans = ans;
maxk = i;
}
}
for( i = 1; i <= n - 1; i++ ) {
printf("%d, ", lake_fishing_time[maxk][i]);
}
printf("%d\n", lake_fishing_time[maxk][n]);
printf("Number of fish expected: %d\n\n", maxans);
}
return 0;
}
本文解析了一道关于在多个湖中钓鱼的算法题,通过优先队列实现最优选择策略,确保在限定时间内获得最多数量的鱼。文章详细介绍了算法的具体实现过程,包括如何初始化湖的信息、计算钓鱼时间和路径时间,以及最终输出钓鱼结果。
5万+

被折叠的 条评论
为什么被折叠?



