zoukankan      html  css  js  c++  java
  • Evanyou Blog 彩带

      题目传送门


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

      Code:

      

    #include<cstdio>
    #include<cstring>
    #include<cstdlib>
    #include<cmath>
    #include<iostream>
    #include<iomanip>
    #include<algorithm>
    #include<queue>
    using namespace std;
    const int N=10001;
    int n,h,d[N],t[N],ans;
    struct Fish{
      int f,id;
      bool operator < (Fish a) const{
        return f<a.f;}
    }f[N];
    priority_queue<Fish>team;
    inline void ready()
    {
      cin>>n>>h;h*=12;
      for(int i=1;i<=n;i++)
        cin>>f[i].f,f[i].id=i;
      for(int i=1;i<=n;i++)
        cin>>d[i];
      t[1]=0;
      for(int i=2;i<=n;i++)
        cin>>t[i];
    }
    inline void work()
    {
      for(int i=1;i<=n;i++){
        h-=t[i];
        int now=0;
        while(!team.empty())
          team.pop();
        for(int j=1;j<=i;j++)
          team.push(f[j]);
        for(int j=1;j<=h;j++){
          Fish x;
          x=team.top();
          team.pop();
          if(x.f>0)
          now+=x.f;
          x.f-=d[x.id];
          team.push(x);
        }
        ans=max(ans,now);
      }
      cout<<ans<<endl;
    }
    int main()
    {
      ios::sync_with_stdio(false);
      ready();
      work();
      return 0;
    }
  • 相关阅读:
    【转帖】Explorer参数详解
    获取html页面时如何选择合适的Encoding
    不要在wpf窗口类的构造函数中抛异常
    把FlvDownloader重构了一下
    VK Cup 2012 Qualification Round 1 A. Next Round
    迎接2012新赛季——HDOJ系列热身赛(2) Problem A HDU 4161 Iterated Difference
    青蛙过河~~~~
    VK Cup 2012 Qualification Round 1 D. Ice Sculptures
    HDU 1006 Tick and Tick
    ACM参赛总结
  • 原文地址:https://www.cnblogs.com/cytus/p/8819524.html
Copyright © 2011-2022 走看看