| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
Re:无言..这样可以过In Reply To:无言 Posted by:200530720224 at 2007-08-15 12:31:40
#include "iostream"
using namespace std;
#define big 27
main()
{
//int cas;//n个事件
int n;//n个湖
int h;//h个小时
int left=0;//现在剩下的时间
int fi[big];//湖的初始钓总鱼量
int di[big];//钓鱼量减小数
int fn[big];//当前鱼量
int fmax=0;//最大鱼量
int sum=0;//所钓的鱼量
int sumax=0;
int fk=0;
int ti[big];//湖之间的走路的时间
int end[big];//记录在那个湖结束钓鱼的总时间
int i,k;
int take[big]={0};//每次的时间..这两个take都是为了输出而用的...对题目的求解没有用
int taketime[big]={0};//最大的确定时间
while(1){
left=0;
cin>>n;
if(n==0)break;
cin>>h;
h=h*60;//h为小时
for(i=0;i<n;i++)cin>>fi[i];
for(i=0;i<n;i++)cin>>di[i];
end[0]=0;
for(i=0;i<n-1;i++){
cin>>ti[i];
end[i+1]=end[i]+ti[i]*5;
}
sumax=-1;
for(i=0;i<n;i++){
left=h-end[i];
for(k=0;k<=i;k++){
fn[k]=fi[k];//初值
take[k]=0;
}
while(left>0){
fmax=fn[0];
for(k=0;k<=i;k++){
// if(fk==k)fn[k]=fn[k]-di[k];//上次钓了就减
//if(fn[k]==0)continue;
if(fmax<fn[k]){
fmax=fn[k];//找之中的最大
fk=k;
}
}
if(fmax==0)break;
sum+=fmax;
fn[fk]=fn[fk]-di[fk];//上次钓了就减
if(fn[fk]<0)fn[fk]=0;
//if(fmax<0)fmax=0;
left-=5;
take[fk]+=5;
fk=0;
}
take[0]+=left;
//cout<<sum<<endl;
if(sumax<sum){
sumax=sum;
for(k=0;k<=i;k++){//改成<=i.就这么简单.可以过
taketime[k]=take[k];
take[k]=0;//清0,为下次用
}
}
//else if()不用这个........这样可以过了
sum=0;
fk=0;
}
for(k=0;k<n-1;k++){
cout<<taketime[k]<<", ";
taketime[k]=0;
}
cout<<taketime[k]<<endl;
taketime[k]=0;
cout<<"Number of fish expected: "<<sumax<<endl;//所钓鱼的最大鱼量
cout<<endl;
}
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator