标签: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 }
标签:isp opened line iostream hid show www. 不难 没有
原文地址:https://www.cnblogs.com/cytus/p/8819524.html