NOIP2011 观光公交

NOIP2011 观光公交话说 我终于 AC 了这个题这是一个贪心 说实话开始做的时候 完全没看出来 QAQ 可能有人说这是个 dp 但这真不是 dalao 请无视 这真的只是个贪心 首先对于每个点当然是能走就走 不能走就等待 这是无法控制的 所以只考虑氮气加速器加在哪里可以使时间总和尽量少 所以如果选择加速 可能会使后面等待的时间更长 或者更短 对后面都会有影响 但是沿着一条边加速会影响后面的所

话说,我终于AC了这个题

这是一个贪心,说实话开始做的时候……完全没看出来QAQ。。

可能有人说这是个dp,但这真不是(dalao请无视)

这真的只是个贪心。。。。

所以

如果选择加速,可能会使后面等待的时间更长,或者更短,对后面都会有影响。

但是沿着一条边加速会影响后面的所有边么?

这可不一定

来来来,我们分类讨论一下:

即每次用加速器都会对后面的人有影响,

用 $ sum_i $ 记录到i的人数,前缀和处理, $ g_i $ 代表每个点所能影响到的最远点,

那么 $ sum_{i + g_i} – sum_i $ 即是能影响到的人数

这样就很容易想到选择影响尽量大的点减掉(在这里贪心)。

CODE:

/*last[i] : 最后一个人到达i站点的时间。 sum[i] : 到i站点的总人数。 enter[i] : 公交车到i站点的最少时间。 g[i] : 每个站点所能影响到的最远站点,即要求的影响。*/ #include 
    
      #include 
     
       #include 
      
        #include 
       
         #define N 30001 using namespace std; int n,m,k; int dis[N],last[N],g[N],enter[N]; int ans,sum[N],maxx = -1; struct node { int time,start,end; }a[N]; inline void bus(int x) { while(x) { --x; g[n] = g[n - 1] = n; int tar; maxx = -1; for(int i = n - 2 ; i >= 1 ; -- i) { if(enter[i + 1] <= last[i + 1])//下一个点如果等待 g[i] = i + 1;//最多影响到下一个 else //不等待 g[i] = g[i + 1];//继续减少后面的时间 } for(int i = 1 ; i < n ; ++ i){//for边数 int tmp = sum[g[i]] - sum[i];//最多影响的人数 if(tmp > maxx && dis[i] > 0){ maxx = tmp; tar = i;//标记最优情况减的点 } } ans -= maxx;//更新ans dis[tar] --;//减掉dis for(int i = 2 ; i <= n ; ++ i) enter[i] = max(enter[i - 1],last[i - 1]) + dis[i - 1];//重新更新enter } return; } int main(){ scanf("%d%d%d",&n,&m,&k); for(int i = 1 ; i < n ; ++ i) scanf("%d",&dis[i]); for(int i = 1 ; i <= m ; ++ i) scanf("%d%d%d",&a[i].time,&a[i].start,&a[i].end); for(int i = 1 ; i <= m ; ++ i) { last[a[i].start] = max(last[a[i].start],a[i].time);//最后一个人到a[i].start站点的时间 和到这个点的时间取max sum[a[i].end] ++; } enter[1] = last[1]; for(int i = 1 ; i <= n ; ++ i) sum[i] += sum[i - 1];//到i站点的总人数 前缀和处理 for(int i = 2 ; i <= n ; ++ i) enter[i] = max(enter[i - 1],last[i - 1]) + dis[i - 1];//公车到i站点的最少时间 和最后到的时间取max for(int i = 1 ; i <= m ; ++ i) ans += enter[a[i].end] - a[i].time;//处理出不加加速器的answer,后面就可以直接减啦~ bus(k); printf("%d \n",ans); return 0; } 
        
       
      
    

真的是考验智商QAQ…

转载于:https://www.cnblogs.com/Repulser/p/10665627.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/223560.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月17日 下午1:55
下一篇 2026年3月17日 下午1:56


相关推荐

  • clone一个react项目怎么运行[通俗易懂]

    首先当你从git上面clone一个项目的时候怎么让项目跑起来,首先看项目目录结构,找到README.md上面有项目运行的步骤,如果没有可以看package.json文件,找到scripts上面有dev所以跑起来项目就使用npmrundev有start就使用npmstart但是要先安装项目依赖使用npminstall依赖下载完成就可以使用npmrundev/npm…

    2022年4月15日
    37
  • Delphi 2007 的PNGimage

    Delphi 2007 的PNGimage本想随意的调整一下界面 于是从 Delphi 盒子下了个 pngimage1 5 结果在 Delphi2007 里用不了 还好 参考了一下 D2009 的代码 于是 OK 了 效果如下 nbsp 代码改动 位置 第 4469 行 CopyFormD200 564 nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp begin nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp pRGBTriple ImageData i pRGB

    2026年3月17日
    2
  • 关于opacity属性的探究

    关于opacity属性的探究关于opacity属性的探究上问题!!在前一段时间我朋友和我讨论到了opcaity的属性问题问题如下:代码如下清重点关注opcaity<!–css样式–><style>.boxfather{width:500px;height:500px;background-color:blue;text-align:cen

    2022年5月26日
    38
  • JSP页面之间传值的方法总结

    JSP页面之间传值的方法总结B S 页面间通信 HTTP 是无状态的协议 Web 页面本身无法向下一个页面传递信息 如果需要让下一个页面得知该页面中的值 除非通过服务器 因此 Web 页面保持状态并传递给其它页面 是一个重要的技术 Web 页面之间传递数据 是 Web 程序的重要功能在 HTTP 协议中一共有 4 种方法来完成这件事情 1 URL 传值 2 表单传值 3 Cookie 方法

    2026年3月19日
    2
  • Tomcat常用配置

    Tomcat常用配置

    2020年11月19日
    197
  • vue 虚拟dom和diff算法详解

    vue 虚拟dom和diff算法详解虚拟 dom 是当前前端最流行的两个框架 vue 和 react 都用到的一种技术 都说他能帮助 vue 和 react 提升渲染性能 提升用户体验 那么今天我们来详细看看虚拟 dom 到底是个什么鬼虚拟 dom 的定义与作用什么是虚拟 dom 大家一定要记住的一点就是 虚拟 dom 就是一个普通的 js 对象 是一个用来描述真实 dom 结构的 js 对象 因为他不是真实 dom 所以才叫虚拟 dom 虚拟 dom 的结构从下图中 我们来看一看虚拟 dom 结构到底是怎样的如上图 这就是虚拟 dom 的结构 他是一个对象 下面有 6 个属性

    2026年3月20日
    1

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号