[NOIP2011 提高组] 观光公交
2022/2/8 23:20:40
本文主要是介绍[NOIP2011 提高组] 观光公交,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
笑死 不开long long 见祖宗
#include<bits/stdc++.h> using namespace std; int n,m,k,dis[1010]; struct node{ int t,u,v; }a[100010]; int sum[10100],maxx;//每站人数 最多影响人数 int last[10100],sc[10100],g[10100];//没有时间观念的先生们 long long ans; 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].t,&a[i].u,&a[i].v); } for(int i=1;i<=m;i++) { last[a[i].u]=max(last[a[i].u],a[i].t);//开始时间 sum[a[i].v]++; } for(int i=1;i<=n;i++) { sum[i]+=sum[i-1];//各站点人数 } sc[1]=last[1]; for(int i=2;i<=n;i++) { sc[i]=max(sc[i-1],last[i-1])+dis[i-1];//出站时间 } for(int i=1;i<=m;i++) { ans+=sc[a[i].v]-a[i].t;//无加速器 } while(k) { k--; g[n]=g[n-1]=n; maxx=-1; int best_id; for(int i=n-2;i>=1;i--) { if(sc[i+1]<=last[i+1]) g[i]=i+1;//需要等 else g[i]=g[i+1]; } for(int i=1;i<n;i++) { if(sum[g[i]]-sum[i]>maxx && dis[i]>0)//可以为更多人节省时间 { maxx=sum[g[i]]-sum[i]; best_id=i; } } ans-=maxx; dis[best_id]--;//可能小于0 for(int i=2;i<=n;i++) { sc[i]=max(sc[i-1],last[i-1])+dis[i-1];//更新出站时间 } } printf("%lld",ans); return 0; }
先计算总时间在一个人一个人地减是比较好的
其次对于while内第一个循环,应该加一句
if(dis[i]==0) { g[i]=0; continue; }
但不加也能过 这个循环正着推要两层循环会炸
这篇关于[NOIP2011 提高组] 观光公交的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2025-01-11cursor试用出现:Too many free trial accounts used on this machine 的解决方法
- 2025-01-11百万架构师第十四课:源码分析:Spring 源码分析:深入分析IOC那些鲜为人知的细节|JavaGuide
- 2025-01-11不得不了解的高效AI办公工具API
- 2025-01-102025 蛇年,J 人直播带货内容审核团队必备的办公软件有哪 6 款?
- 2025-01-10高效运营背后的支柱:文档管理优化指南
- 2025-01-10年末压力山大?试试优化你的文档管理
- 2025-01-10跨部门协作中的进度追踪重要性解析
- 2025-01-10总结 JavaScript 中的变体函数调用方式
- 2025-01-10HR团队如何通过数据驱动提升管理效率?6个策略
- 2025-01-10WBS实战指南:如何一步步构建高效项目管理框架?