http://poj.org/problem?id=1042

此题没有AC成功,因为每个湖的时间输出有一定的顺序要求,目前还不知道怎么处理。。。

#include<iostream>
using namespace std;
struct Lake{

int id;
int time;
int num;
int decr;
bool operator > (const Lake &a)const{
return num > a.num;
}
void operator =( Lake &a){
id=a.id;
time=a.time;
num=a.num;
decr=a.decr;
}
};
int nums[30];
int decrs[30];
int dists[30];
int lakeTime[30];//存放第i个湖所花费的时间
Lake lakes[30];//全局变量,子函数也可以访问
void heapBuild(int n);//堆初始建立
void sink(int i,int n);
void swap(Lake &a,Lake &b);
int max(int n);//每次从堆里弹出一个最大值,
//然后再自行减少,最后自行下沉,维护堆得结构


int main(){
int n;
while(cin>>n&&n!=0){
double h;
cin>>h;
int totalFish,maxFish=0;
int times ;
for(int i=1;i<=n;i++)
cin>>nums[i];
for(int i=1;i<=n;i++)
cin>>decrs[i];
int tempDist;
int totalDistToI=0;
dists[1]=0;//注意dists[]里面存储的是从第一个到第i个池塘路程上所花的总时间。
for(int i=2;i<=n;i++){
cin>>tempDist;
totalDistToI+=tempDist;
dists[i]=totalDistToI;
}
//输入处理完后,枚举最远到达第i个池塘所能钓到的最大鱼数。
for(int terminal=1;terminal<=n;terminal++){
totalFish=0;
times=h*12-dists[terminal];//所生的钓鱼的时间
//对lakes里面的数据重新输入
for(int j=1;j<=terminal;j++){
lakes[j].id=j;
lakes[j].time=0;
lakes[j].num=nums[j];
lakes[j].decr=decrs[j];
}
heapBuild(terminal);
for(int i=1;i<=times;i++)
totalFish+=max(terminal);
//cout<<totalFish<<" ";
if(maxFish<totalFish){
maxFish=totalFish;
for(int i=1;i<=n;i++)
lakeTime[i]=0;
for(int i=1;i<=terminal;i++)
//lakeTime[lakes[i].id]=lakes[lakes[i].id].time;
lakeTime[lakes[i].id]=lakes[i].time;
}
}

//处理输出
for(int i=1;i<=n;i++){
cout<<lakeTime[i];
if(i!=n)
cout<<", ";
}
cout<<endl;
cout<<"Number of fish expected: "<<maxFish<<endl<<endl;

}
return 0;
}
void heapBuild(int n){
//该循环为初始堆的建立,从最后一个分支节点开始
for(int i=n/2;i>=1;i--){
sink(i,n);//调用下沉子函数
}
}
void sink(int i,int n){
int child;
int j=i;
while(j<=n/2){
child=j*2;
if((child!=n)&&lakes[child+1]>lakes[child])
child=child+1;
if(lakes[child]>lakes[j])
swap(lakes[child],lakes[j]);
j=child;
}
}
int max(int n){
lakes[1].time+=5;
int maxNum=lakes[1].num;
lakes[1].num-=lakes[1].decr;
if(lakes[1].num<0)lakes[1].num=0;
sink(1,n);
return maxNum;
}
void swap(Lake &a,Lake &b){
Lake temp =a;
a=b;
b=temp;
}

posted on 2011-09-30 20:21  geeker  阅读(392)  评论(0编辑  收藏  举报