| ||||||||||
| 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 | |||||||||
我晕了,大牛们帮忙看看这个有注释的程序吧。//WA了……
#include "cstdio"
#include "memory"
const int maxn=25;
bool I//判断是否加空行;
int a,//最多鱼数
s,//贪心中的鱼数
k,//钓鱼次数
h,n,t[maxn+1],f[maxn+1],d[maxn+1],
T[maxn+1],//当前每个湖的鱼的数量
B[maxn+1],//最优解的每个湖钓鱼次数
H[maxn+1],//堆
S[maxn+1];//当前解的每个湖的钓鱼次数
int main(void)
{
bool Init(void);
void Greedy(void);
void Print(void);
for(I=false;;I=true)
{
if(Init()) return 0;
if(I) putchar('\n');
Greedy();
Print();
}
}
bool Init(void)
{
int i;
scanf("%d",&n);
if(n==0) return true;
scanf("%d",&h);
h*=60;//换算成minites
for(i=1;i<=n;i++) scanf("%d",&f[i]);
for(i=1;i<=n;i++) scanf("%d",&d[i]);
for(i=1;i<n;i++) scanf("%d",&t[i]);
a=0;
memset(B,0,sizeof(B));
return false;
}
void Greedy(void)
{
int i,j,l;//l记录当前在哪个湖钓鱼
void BuildHeap();//建堆
int Max(int&);//取最大值
void UpdateAnswer();//更新解
for(k=1;k<=n;k++)
{
h-=5*t[k-1];//计算还剩多少时间
if(h<=0) break;
i=h/5;//i记录可以钓多少次鱼
s=0;
memset(S,0,sizeof(S));
BuildHeap();
for(j=0;j<i;j++)
{
s+=Max(l);
S[l]++;
}
if(a<s) UpdateAnswer();
}
}
void Print(void)
{
for(int i=1;i<n;i++) printf("%d, ",5*B[i]);
printf("%d\nNumber of fish expected: %d\n",5*B[n],a);
}
void swap(int&,int&);
void BuildHeap()
{
int i;
for(i=1;i<=k;i++) H[i]=i,T[i]=f[i];
for(i=k;i>1;i--)
if(T[H[i]]>T[H[i>>1]]) swap(H[i],H[i>>1]);
}
int Max(int &l)
{
int i,M;
if(T[H[1]]<=0)
{
l=1;
return 0;
}
M=T[i=l=H[1]];//取最优解
T[l]-=d[l];//更新
i=1;
while((((i<<1)<=k)&&(T[H[i<<1]]>T[H[i]]))||
((((i<<1)+1)<=k)&&(T[H[(i<<1)+1]]>T[H[i]])))
if((((i<<1)+1)>k)||(T[H[i<<1]]>T[H[(i<<1)+1]])) swap(H[i],H[i<<1]),i<<=1;
else swap(H[i],H[(i<<1)+1]),i=(i<<1)+1;
//维护堆
return M;
}
void UpdateAnswer()
{
a=s;
for(int i=1;i<=k;i++) B[i]=S[i];
}
void swap(int &i, int &j)
{
int t;
t=i;
i=j;
j=t;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator