经典C题目目GoneFishing算法详解及源代码Word下载.docx
- 文档编号:20467070
- 上传时间:2023-01-23
- 格式:DOCX
- 页数:9
- 大小:73.56KB
经典C题目目GoneFishing算法详解及源代码Word下载.docx
《经典C题目目GoneFishing算法详解及源代码Word下载.docx》由会员分享,可在线阅读,更多相关《经典C题目目GoneFishing算法详解及源代码Word下载.docx(9页珍藏版)》请在冰豆网上搜索。
}};
intnl,time,f[N],t[N],d[N],totf,stay[N],beststay[N];
typedefpriority_queue<
node>
PQ;
booloperator<
(constnode&
a,constnode&
b){if(a.nf==b.nf)returna.idx>
b.idx;
returna.nf<
b.nf;
}
intmain(){
inti,j;
while(scanf("
%d"
&
nl),nl){
scanf("
time);
time*=12;
intmaxf=-1;
for(i=0;
i<
nl;
i++)scanf("
f+i);
d+i);
nl-1;
t+i);
i++){
memset(stay,0,sizeof(stay));
totf=0;
if(i>
0)time-=t[i-1];
nodenow;
PQpq;
for(j=0;
j<
=i;
j++)
{now.set(f[j],j);
pq.push(now);
}
time;
j++){
now=pq.top();
pq.pop();
stay[now.idx]+=5;
totf+=now.nf;
now.nf-=d[now.idx];
if(now.nf<
0)now.nf=0;
if(totf>
maxf){
maxf=totf;
memcpy(beststay,stay,sizeof(stay));
printf("
beststay[0]);
for(i=1;
i++)printf("
%d"
beststay[i]);
\nNumberoffishexpected:
%d\n\n"
maxf);
return0;
include<
constintsize=26;
intn,h,ca;
intf[size],t[size],d[size],tf[size];
intans[size],tans[size],flag;
intmain()
{
inti,j,k,sum,time,tt,tnum,maxsum,nextmin,t1;
while(cin>
>
n)
{
if(n==0)break;
ca++;
if(ca>
1)
cout<
<
endl;
cin>
h;
maxsum=-100;
h*=60;
t1=0;
for(i=1;
i<
=n;
i++){cin>
f[i];
tf[i]=f[i];
i++)cin>
d[i];
n;
t[i];
i++)ans[i]=tans[i]=0;
i++)
t1+=t[i-1];
time=(h-t1*5)/5;
sum=0;
for(j=1;
j<
j++)tans[j]=0;
if(i==1&
&
d[1]!
=0)
tans[1]=time;
tt=f[1]/d[1];
if(f[1]%d[1])tt++;
if(time>
=tt)sum=(f[1]+f[1]-(tt-1)*d[1])*tt/2;
elsesum=(f[1]+f[1]-(time-1)*d[1])*time/2;
time=0;
elseif(i==1&
d[1]==0)
sum=time*f[1];
while(time>
0)
tnum=0;
k=1;
nextmin=0;
flag=0;
j++)
if(tnum<
f[j])
tnum=f[j];
if(nextmin<
f[j]&
f[j]!
=tnum)
nextmin=f[j];
i;
if(f[j]!
=f[j+1])
{flag=1;
break;
if(tnum==0)
tans[1]+=time;
break;
if(flag==0||f[1]==tnum)
sum+=f[1];
f[1]-=d[1];
if(f[1]<
0)f[1]=0;
tans[1]++;
time--;
continue;
if(f[j]==tnum&
d[j]!
=0&
time>
sum+=f[j];
tans[j]++;
f[j]-=d[j];
if(time<
0)time=0;
if(f[j]<
0)f[j]=0;
elseif(f[j]==tnum&
d[j]==0&
tans[j]+=time;
sum+=time*f[j];
if(maxsum<
sum)
maxsum=sum;
ans[j]=tans[j];
j++)
f[j]=tf[j];
cout<
ans[i]*5;
if(i!
=n)cout<
"
"
;
elsecout<
endl;
Numberoffishexpected:
"
maxsum<
}
问题描述:
给定由n个整数(包含负整数)组成的序列a1,a2,...,an,求该序列子段和的最大值。
当所有整数均为负值时定义其最大子段和为0。
依此定义,所求的最优值为:
例如,当(a1,a2,a3,a4,a5,a6)=(-2,11,-4,13,-5,-2)时,最大子段和为:
一个简单算法:
intMaxSum(intn,a,&
besti,&
bestj)
{intsum=0;
j++){
intthissum=0;
for(k=i;
k<
=j;
k++)
thissum+=a[k];
if(thissum>
sum){
sum=thissum;
besti=i;
bestj=j;
returnsum;
算法有3重循环,复杂性为O(n3)。
由于有:
算法可作如下改进:
for(i=1;
i++){intthissum=0;
for(j=i;
j++){
thissum+=a[j];
if(thissum>
sum=thissum;
besti=i;
bestj=j;
改进后的算法复杂性为O(n2)。
从问题的解的结构可以看出,它适合于用分治策略求解:
如果将所给的序列a[1:
n]分为长度相等的两段a[1:
n/2]和a[n/2+1:
n],分别求出这两段的最大子段和,则a[1:
n]的最大子段和有三种情形:
a[1:
n]的最大子段和与a[1:
n/2]的最大子段和相同;
n]的最大子段和与a[n/2+1:
n]的最大子段和相同;
n]的最大子段和为下面的形式。
A、B这两种情形可递归求得。
对于情形C,容易看出,a[n/2]与a[n/2+1]在最优子序列中。
因此,我们可以在a[1:
n]中分别计算出如下的s1和s2。
则s1+s2即为出现情形C时的最优值。
从而设计出下面所示的分治算法。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 经典 题目 GoneFishing 算法 详解 源代码
![提示](https://static.bdocx.com/images/bang_tan.gif)