0
点赞
收藏
分享

微信扫一扫

POJ1042 贪心钓鱼

题意:
      你有H小时(H*12个单位)时间去用,有n个鱼池在一条直线上,一开始你在1的位置,可以选择在某些鱼池上钓鱼,但是如果持续在一个鱼池上钓鱼钓鱼速度回成线性减少,初始每个时间单位钓fi条,然后下一个时间单位钓fi-di条,再下一个fi-di-di条,每个鱼池和他下一个鱼池的距离是ti个时间单位,最后你可以听到任意一个鱼池上,问最多钓多少条鱼,然后输出在个鱼池的停留时间和最多的鱼数。


思路:
      枚举终点,对于每一个枚举的终点也就是相当于拥有了一段可以随意选的鱼塘,然后我们在枚举区间没一个单位一个单位的去选,每次都去选最优的一个,然后加到总和里,然后把当前这个鱼塘的速度改变下,这里可以用优先队列去实现,每次拿出一个最优的,然后更新总和,然后把拿出来这个更改数值后存回队列,还有就是注意输出要求,答案不确定的时候输出什么啥的一些小细节。

#include<queue>

#include<stdio.h>

#include<string.h>



using namespace std;



typedef struct NODE

{

int id ,f ,d;

friend bool operator < (NODE a ,NODE b)

{

return a.f < b.f || a.f == b.f && a.id > b.id;

}

}NODE;



int main ()

{

int n ,h ,i ,j ,sum ,tsum;

int ans[30] ,tans[30];

int tt[30];

NODE node[30];

int mk = 0;

while(~scanf("%d" ,&n) && n)

{

if(mk) printf("\n");

mk = 1;

scanf("%d" ,&h);

for(i = 1 ;i <= n ;i ++)

{

scanf("%d" ,&node[i].f);

node[i].id = i;

}

for(i = 1 ;i <= n ;i ++)

scanf("%d" ,&node[i].d);

for(i = 1 ;i < n ;i ++)

scanf("%d" ,&tt[i]);

memset(ans ,0 ,sizeof(ans));

sum = -1;

int s = 0;

h *= 12;

for(i = 1 ;i <= n ;i ++)

{

if(i == 1) s = 0;

else s += tt[i-1];

if(s > h) break;

priority_queue<NODE>q;

NODE xin ,tou;

for(j = 1 ;j <= i ;j ++)

q.push(node[j]);

int hh = h - s;

memset(tans ,0 ,sizeof(tans));

tsum = 0;

while(hh--)

{

tou = q.top();

q.pop();

tans[tou.id] += 5;

tsum += tou.f;

tou.f -= tou.d;

if(tou.f < 0) tou.f = 0;

q.push(tou);

}

if(tsum > sum)

{

for(j = 1 ;j <= n ;j ++)

ans[j] = tans[j];

sum = tsum;

}

}

for(i = 1 ;i <= n ;i ++)

{

if(i == n) printf("%d\n" ,ans[i]);

else printf("%d, ",ans[i]);

}

printf("Number of fish expected: %d\n" ,sum);

}

return 0;

}





举报

相关推荐

0 条评论