题目链接:http://poj.org/problem?id=1042
这题是慕课郭炜老师算法课程里面的一道例题,我用他教的思路写出来的代码。
代码长了点 但是内容简单 思路易懂!
附郭炜老师课件截图和视频讲解地址
1、题意:
2、分析
本题思路就是枚举最终停下来的湖,这样就能算出纯钓鱼的时间片个数 K 。然后用一个三元组(F,i,j)表示第 i 个湖的第 j 个时间片所能钓到鱼的数量为F。然后按照钓鱼的数量从大到小排序(注意排序这块是个难点,要用到stable_sort 我就是在这错了)。取前K个即是问题的答案!
代码
#include<iostream>
#include<string>
#include<map>
#include<vector>
#include<algorithm>
#include<stdio.h>
#include<cstring>
#include<stdlib.h>
#include<sstream>
#include<set>
#include<cmath>
typedef long long ll;
using namespace std;
struct node1
{
int fishnum;
int time[30];
};
struct node2///(F,no,tt)三元组表示第no个湖的第tt个时间片所能钓到鱼的数量为F。
{
int F;
int no;
int tt;
};
struct rule1
{
bool operator()( const node1 &t1,const node1 &t2)
{
return t1.fishnum>t2.fishnum;
}
};
struct rule2
{
bool operator()(const node2 &t1,const node2 &t2)
{
return t1.F>t2.F;
}
};
int maxfish;
int main()
{
// freopen("in.txt","r",stdin);
ios::sync_with_stdio(false);
int n;
while(cin>>n&&n)
{
node1 a[30];
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
a[i].time[j]=0;
}
int h;
maxfish=0;
int f[30];
int d[30];
int t[30];
cin>>h;
for(int i=1;i<=n;i++) cin>>f[i];
for(int i=1;i<=n;i++) cin>>d[i];
t[0]=0;//到第一个湖的时间为0
for(int i=1;i<n;i++) cin>>t[i];
int k=0;///纯钓鱼的时间片个数
for(int x=1;x<=n;x++)///枚举最终停下来的湖
{
int walktime=0;//走路用的时间片
for(int j=1;j<x;j++)
walktime+=t[j];
k=h*12-walktime;//纯钓鱼的时间片个数
node2 m[5000];///最多就是n*k个
int kase=0;
int number=0;
for(int i=1;i<=x;i++)
for(int j=1;j<=k;j++)
{
number=f[i]-(j-1)*d[i];
if(number>0)
{
m[kase].F=number;
m[kase].no=i;
m[kase].tt=j;
kase++;
}
else
{
m[kase].F=0;
m[kase].no=i;
m[kase].tt=j;
kase++;
}
}
stable_sort(m,m+kase,rule2());///!!!!!!!!!用
// for(int i=0;i<kase;i++)
// {
// cout<<m[i].F<<" "<<m[i].no<<" "<<m[i].tt<<endl;
// }
int num=0;
for(int i=0;i<k;i++)
num+=m[i].F;
a[x].fishnum=num;
for(int i=0;i<k;i++)
{
for(int j=1;j<=x;j++)
{
if(m[i].no==j)
{
if(m[i].tt>a[x].time[j])
a[x].time[j]=m[i].tt;
}
}
}
// cout<<"-----------------------"<<endl;
}
sort(a+1,a+1+n,rule1());
for(int i=1;i<=n;i++)
{
if(i==n)
cout<<a[1].time[i]*5<<endl;
else
cout<<a[1].time[i]*5<<", ";
}
cout<<"Number of fish expected: "<<a[1].fishnum<<endl<<endl;
}
return 0;
}