noip2011 观光公交 递推+贪心
2016-11-07 20:46
375 查看
考虑一个加速器对答案的影响,如果加速后一个人下车了,那么这个人时间缩短了一秒。所以在没有发生车等人的情况下,每当有一人下车,时间就会缩短一秒。然后各个加速器之间是互不影响的。所以可以贪心。
预处理出每个点可以向后拓展,直到发生车等人的长度。再用前缀和维护一段区间下车的人数。
预处理出每个点可以向后拓展,直到发生车等人的长度。再用前缀和维护一段区间下车的人数。
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #define maxn 20005 using namespace std; struct per { int start,T,to; }a[maxn]; int n,m,K,ans; int f[maxn],rec[maxn],g[maxn],dis[maxn],sum[maxn]; 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].start,&a[i].to); f[a[i].start]=max(f[a[i].start],a[i].T); sum[a[i].to]++; } for(int i=2;i<=n;i++) sum[i]+=sum[i-1]; rec[1]=0; for(int i=2;i<=n;i++) rec[i]=max(rec[i-1],f[i-1])+dis[i-1]; for(int i=1;i<=m;i++) ans+=rec[a[i].to]-a[i].T; while(K) { g =n; g[n-1]=n; for(int i=n-2;i;i--) { if(rec[i+1]<=f[i+1]) g[i]=i+1; else g[i]=g[i+1]; } int Max=0,j; for(int i=1;i<=n;i++) if(sum[g[i]]-sum[i]>Max&&dis[i]>0) Max=sum[g[i]]-sum[i],j=i; if(!Max) break; ans-=Max; dis[j]--; K--; rec[1]=0; for(int i=2;i<=n;i++) rec[i]=max(rec[i-1],f[i-1])+dis[i-1]; } cout<<ans; return 0; }
相关文章推荐
- NOIP 2011 观光公交 贪心+递推
- 贪心(模拟费用流):NOIP2011 观光公交
- noip2011 观光公交 (贪心)
- 【NOIP2011提高组T6】观光公交-贪心
- 贪心——Luogu1315 [NOIP2011]观光公交
- noip2011观光公交贪心详解
- NOIP2011 观光公交(贪心)
- WikiOI 1139 观光公交 (NOIP2011) 贪心
- 观光公交 2011年NOIP全国联赛提高组(贪心,递推)
- Luogu 1315 【NOIP2011】观光公交 (贪心)
- NOIP2011 观光公交 解题报告(贪心(贪心一次更新一次))
- 【贪心】NOIP2011观光公交详解
- NOIP 2011 提高组 复赛 day2 bus 观光公交
- 【noip2011】观光公交
- noip 2011观光公交
- [NOIP 2011] 观光公交
- 【NOIP2011 day2】观光公交
- NOIP2011复赛提高组day2(A:计算系数 B:聪明的质监员 C:观光公交)
- noip2011 观光公交
- [NOIP2011] 提高组 洛谷P1315 观光公交