poj 1042Gone Fishing

本文介绍了一种使用贪心算法结合枚举的方法解决湖泊钓鱼问题的程序实现。通过枚举最远到达的湖,并利用自定义堆结构来优化选择过程,以在限定时间内最大化钓鱼数量。

贪心算法+枚举

枚举最远到达那个湖i,先把总时间减去走到湖i的时间,剩下的可以看做在i个湖里每次拿一个最大的,用了一个自定义的堆结构

#include<iostream>

#include<cstring>
#include<cstdio>
#include<queue>
using namespace std;
struct node{
int num;
int loca;
node(int nn = 0,int ll = 0){
num = nn;
loca = ll;
}
};
bool operator<(node a,node b){
if(a.num==b.num)return a.loca>b.loca;
return a.num<b.num;
}
const int MAXN = 30;
int h;
int n;
int d[MAXN];
int f[MAXN];
int ans_n[MAXN];
int ans_sum;
int T[MAXN];
int main(){
T[0] = 0;

while(scanf("%d",&n),n){

scanf("%d",&h);
h = h*60;
for(int i = 0;i<n;i++)scanf("%d",&f[i]);
for(int i = 0;i<n;i++)scanf("%d",&d[i]);
for(int i = 1;i<n;i++)scanf("%d",&T[i]),T[i] = T[i]+T[i-1];
int hh = h;
int left = f[0];
ans_sum = 0;
memset(ans_n,0,sizeof(ans_n));
while(left>0 && hh>0){
ans_sum+=left;
left-=d[0];
hh-=5;
ans_n[0]+=5;
}
if(hh>0)ans_n[0]+=hh;
int cop_n[MAXN];
int sum = 0;
for(int i = 1;i<n;i++){
hh = h;
sum = 0;
memset(cop_n,0,sizeof(cop_n));
priority_queue<node> qe;
for(int j = 0;j<=i;j++){
if(f[j]>0)qe.push(node(f[j],j));
}
hh-=5*T[i];
node a;
while(hh>0 && !qe.empty()){
a = qe.top();
qe.pop();
sum+=a.num;
hh-=5;
cop_n[a.loca]+=5;
a.num = a.num-d[a.loca];
if(a.num>0)qe.push(a);
}
if(hh>0)cop_n[0]+=hh;
if(sum>ans_sum){
ans_sum = sum;
memcpy(ans_n,cop_n,MAXN*sizeof(int));
}else if(sum==ans_sum){
bool ok = false;
for(int j = 0;j<=i;j++)if(cop_n[j]>ans_n[j]){
ok = true;
break;
}else if(cop_n[j]<ans_n[j]){
break;
}else;
if(ok)memcpy(ans_n,cop_n,MAXN*sizeof(int));
}else;
}
printf("%d",ans_n[0]);
for(int i = 1;i<n;i++)printf(", %d",ans_n[i]);
printf("\nNumber of fish expected: %d\n\n",ans_sum);
}
return 0;
}
### 北京大学POJ 1042问题代码实现 北京大学POJ平台的1042问题是关于字符串匹配的问题,通常可以通过使用KMP算法来高效解决。以下是针对该问题的详细分析和代码实现。 #### 问题描述 给定一个模式串(pattern)和一个文本串(text),需要判断模式串是否为文本串的子串。如果存在,则输出模式串首次出现的位置;否则输出-1。 #### KMP算法原理 KMP算法的核心思想是利用已匹配部分的信息避免不必要的回溯,从而提高效率[^1]。通过构建部分匹配表(Failure Function),可以快速跳过不必要比较的部分。 #### 代码实现 以下是一个基于Python的KMP算法实现: ```python def compute_lps(pattern): lps = [0] * len(pattern) length = 0 # 长度 of the previous longest prefix suffix i = 1 while i < len(pattern): if pattern[i] == pattern[length]: length += 1 lps[i] = length i += 1 else: if length != 0: length = lps[length - 1] else: lps[i] = 0 i += 1 return lps def kmp_search(text, pattern): m = len(pattern) n = len(text) lps = compute_lps(pattern) i = 0 # index for text[] j = 0 # index for pattern[] while i < n: if pattern[j] == text[i]: i += 1 j += 1 if j == m: return i - j # 返回匹配位置 elif i < n and pattern[j] != text[i]: if j != 0: j = lps[j - 1] else: i += 1 return -1 # 如果未找到匹配 # 示例输入 text = "ABC ABCDAB ABCDABCDABDE" pattern = "ABCDABD" # 调用函数 result = kmp_search(text, pattern) print(result) # 输出结果 ``` 上述代码中,`compute_lps`函数用于生成部分匹配表,而`kmp_search`函数则实现了KMP算法的核心逻辑[^2]。 #### 算法复杂度 KMP算法的时间复杂度为O(n + m),其中n是文本串长度,m是模式串长度。这使得它在处理大规模数据时非常高效[^3]。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值