[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,int,sum,maxx,long,观光,10100,dis 来源: https://www.cnblogs.com/whcxyp20070320/p/15873034.html