码迷,mamicode.com
首页 > 其他好文 > 详细

洛谷P1717 钓鱼

时间:2018-04-13 13:21:14      阅读:155      评论:0      收藏:0      [点我收藏+]

标签:isp   opened   line   iostream   hid   show   www.   不难   没有   

  题目传送门

  分析:数据范围并不大,也不难想到是贪心。因为钓鱼和移动的时间都是5的倍数,而且给定的h以小时为单位,所以在输入的时候可以直接将h乘以12,然后每次钓鱼花费的时间就是1,移动花费的时间就是t[i]。但是因为题目中给定了多个湖泊,而且每次钓鱼后鱼的数量会减少,因此还要考虑最优化策略。当然这里蒟蒻想了很久,还是没有确定的思路,还是靠着ACX大佬的指导才想明白一种非常奇(xuan)妙(xue)的思路:首先从1-n枚举,表示本次会在前i个湖泊内钓鱼。然后直接从h中减去移动花费的时间,接下来就只需要考虑钓鱼就行了。可以用优先队列实现。其实思路真的不难(只是难想到)。具体看代码吧。

  Code:

  

技术分享图片
 1 #include<cstdio>
 2 #include<cstring>
 3 #include<cstdlib>
 4 #include<cmath>
 5 #include<iostream>
 6 #include<iomanip>
 7 #include<algorithm>
 8 #include<queue>
 9 using namespace std;
10 const int N=10001;
11 int n,h,d[N],t[N],ans;
12 struct Fish{
13   int f,id;
14   bool operator < (Fish a) const{
15     return f<a.f;}
16 }f[N];
17 priority_queue<Fish>team;
18 inline void ready()
19 {
20   cin>>n>>h;h*=12;
21   for(int i=1;i<=n;i++)
22     cin>>f[i].f,f[i].id=i;
23   for(int i=1;i<=n;i++)
24     cin>>d[i];
25   t[1]=0;
26   for(int i=2;i<=n;i++)
27     cin>>t[i];
28 }
29 inline void work()
30 {
31   for(int i=1;i<=n;i++){
32     h-=t[i];
33     int now=0;
34     while(!team.empty())
35       team.pop();
36     for(int j=1;j<=i;j++)
37       team.push(f[j]);
38     for(int j=1;j<=h;j++){
39       Fish x;
40       x=team.top();
41       team.pop();
42       if(x.f>0)
43       now+=x.f;
44       x.f-=d[x.id];
45       team.push(x);
46     }
47     ans=max(ans,now);
48   }
49   cout<<ans<<endl;
50 }
51 int main()
52 {
53   ios::sync_with_stdio(false);
54   ready();
55   work();
56   return 0;
57 }
View Code

 

洛谷P1717 钓鱼

标签:isp   opened   line   iostream   hid   show   www.   不难   没有   

原文地址:https://www.cnblogs.com/cytus/p/8819524.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!