您的位置:首页 > 其它

POJ 1042 贪心+遍历 需要一点点转化

2009-09-14 22:34 162 查看
这道题是贪心加遍历

需要一点点转化

遍历需要钓的湖的数目

单纯路过也算钓过

这样在每种情况中

所花费在路上的时间就是一定的

在每种情况中 各个湖除了每时每刻可提供的鱼数不同外

其余都是平等的

目标函数是尽可能多钓鱼

典型的贪心

由于要评选最优策略

因此要将所有情况的结果保留 留待最后进行比较

所以需要很大的空间开销

这是黑书上的一道题

另外

这几天看别人的程序头大

所以这次自己写的时候

将变量名改变了风格

力求看了名字就知道变量的作用

增加程序的可读性实在是很重要

不过还是懒得写注释

程序如下:

 

#include <iostream>

using namespace std;

struct _lake{
int FishRemain;
int Decrease;
int TimeToNext;
int TimeForFishing;
}lake[30],temp_lake[30][30];

int cmp(const void* aa,const void* bb)
{
_lake* a = (_lake*)aa;
_lake* b = (_lake*)bb;
return a->FishRemain-b->FishRemain;
}

int main()
{
int n,h;
int NumOfCase = 0;
while (cin>>n&&n!=0)
{
int Fish[30]={0};
cin>>h;
h*=12;		//1 for 5 minutes
int hToRemember = h;
for (int i = 0;i < n;i++)
cin>>lake[i].FishRemain;
for (int i = 0;i < n;i++)
cin>>lake[i].Decrease;
for (int i = 0;i < n-1;i++)
cin>>lake[i].TimeToNext;
for (int i = 0;i < n;i++)
lake[i].TimeForFishing = 0;
if(NumOfCase++>0)
cout<<endl;
for (int NumOfLakes = 0;NumOfLakes < n;NumOfLakes++)
{
h = hToRemember;
bool NoFish = false;
memcpy(temp_lake[NumOfLakes],lake,sizeof(lake));
for (int i = 0;i < NumOfLakes;i++)
h-=temp_lake[NumOfLakes][i].TimeToNext;
if(h<0)
break;
int max,MaxLake;
while (h>0)
{
max = temp_lake[NumOfLakes][0].FishRemain;
MaxLake=0;
for (int i = 0;i <= NumOfLakes;i++)
{
if(temp_lake[NumOfLakes][i].FishRemain>max)
{
max = temp_lake[NumOfLakes][i].FishRemain;
MaxLake=i;
}
}
if(temp_lake[NumOfLakes][MaxLake].FishRemain<=0)
break;
Fish[NumOfLakes]+=temp_lake[NumOfLakes][MaxLake].FishRemain;
temp_lake[NumOfLakes][MaxLake].FishRemain-=temp_lake[NumOfLakes][MaxLake].Decrease;
temp_lake[NumOfLakes][MaxLake].TimeForFishing+=5;
h--;
}
if(h>0)
temp_lake[NumOfLakes][0].TimeForFishing+=5*h;
}
int max = 0,MaxMethod=0;
for (int i = 0;i < n;i++)
{
if(Fish[i]>max)
{
max = Fish[i];
MaxMethod = i;
}
}
for (int i = 0;i < n;i++)
{
cout<<temp_lake[MaxMethod][i].TimeForFishing;
if(i < n-1)
cout<<", ";
else
cout<<endl;
}
cout<<"Number of fish expected: "<<max<<endl;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: