題目鏈接: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;
}