[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 提高组] 观光公交的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程