• Evanyou Blog 彩带


      题目传送门

      怎么说呢,这个题目我刚开始随便乱搞了几下,交了个暴力代码上去居然还水了49分,数据确实有点弱啊,然后看到洛谷上那位大佬Redbag的题解瞬间就佩服的五体投地,那真的是简洁、易懂又高效。直接用一个结构体和一个优先队列,两边贪心扫过去就水过了。。。。。。Orz。我想我不需要多说,看代码就可以懂了:

    #include<cstdio>
    #include<cstring>
    #include<cstdlib>
    #include<iostream>
    #include<algorithm>
    #include<cmath>
    #include<queue>
    using namespace std;
    int n,numa,numb;
    int ans,t[1001];
    struct Node{
      int s,v;//v表示该机器的效率,s表示用该机器完成工作的总时间;
      bool operator< (Node zo)const
      {return s>zo.s;}
    }x;
    priority_queue<Node>team;//优先队列
    int main()
    {
      std::ios::sync_with_stdio(false);
      cin>>n>>numa>>numb;
      for(int i=1;i<=numa;i++){
        cin>>x.v;
        x.s=x.v;
        team.push(x);//入队
      }
      for(int i=1;i<=n;i++){
        x=team.top();
        team.pop();
        t[i]=x.s;//从第一个工作开始贪心;
        x.s+=x.v;//贪心完后在将总时间加上效率,再次入队
        team.push(x);
      }
      while(!team.empty())team.pop();
    //做完以后清空队列;
    for(int i=1;i<=numb;i++){ cin>>x.v; x.s=x.v; team.push(x);//入队 } for(int i=n;i>=1;i--){ x=team.top(); team.pop(); if(t[i]+x.s>ans)ans=t[i]+x.s;
    //从后往前贪心,如果该件机器完成工作的时间大于答案
    //就更新答案的值,这里不用考虑前面,从后往前贪心对
    //前面的状态没有影响 x.s
    +=x.v; team.push(x);//如上,再次入队 } cout<<t[n]<<" "<<ans; return 0; }
    //大佬的思路是不是极其巧妙、简洁?

    果然大佬就是大佬,我这个蒟蒻要学的还很多啊

  • 相关阅读:
    撕裂寂寞
    创业中的“孙子兵法”
    生命的颜色占卜
    常常激励我们的36句话
    创建自己的3D虚拟身体!
    富人和穷人的八大差异
    有时,孤单是一种享受
    JavaScript类
    上网的十条基本礼节
    程序设计中的感悟
  • 原文地址:https://www.cnblogs.com/cytus/p/7801380.html
Copyright © 2020-2023  润新知