• $NOIP2012$观光公交


    毒瘤贪心题目。。。

    考虑一种贪心,尽可能的给前面的路段加速会更优,但手玩样例就会发现这样是错的。

    考虑到如果公交在某处等待一个人到来,在这之前的加速就对之后无效了。

    所以我们可以将其分段,在每一段的最前面使用加速器即可。

    要维护每一段中的最优放置处的可放次数,可以用数据结构维护。

    但是俺比较懒,就直接扫了,反正(10^8)也能过。

    #include<bits/stdc++.h>
    using namespace std;
    #define int long long
    inline int read()
    {
        int f=1,w=0;char x=0;
        while(x<'0'||x>'9') {if(x=='-') f=-1; x=getchar();}
        while(x!=EOF&&x>='0'&&x<='9') {w=(w<<3)+(w<<1)+(x^48);x=getchar();}
        return w*f;
    }
    const int N=1e5+10;
    int n,m,K,Cnt,ans;
    int Tim[N],D[N],Max[N],Sum[N];
    struct Passenger{int T,A,B;} p[N];
    struct Region{int Id,Nex,Val;} Lin[N];
    signed main(){
    #ifndef ONLINE_JUDGE
        freopen("A.in","r",stdin);//Ans=10
    #endif
    	n=read(),m=read(),K=read();
    	for(int i=1;i<n;i++) D[i]=read();
    	for(int i=1;i<=m;i++)
    	{
    		p[i].T=read(),p[i].A=read(),p[i].B=read();
    		Max[p[i].A]=max(Max[p[i].A],p[i].T),Sum[p[i].B]++;
    	}
    	for(int i=2;i<=n;i++) Tim[i]=D[i-1]+max(Tim[i-1],Max[i-1]);
    	for(int i=1;i<=n;i++) Lin[i].Id=i; Max[n]=1e18;
    	for(int i=1;i<=n;i++) Sum[i]=Sum[i]+Sum[i-1];
    	for(int i=1;i<=m;i++) ans+=Tim[p[i].B]-p[i].T;
    	while(K--)
    	{
    		Lin[n-1].Nex=n;
    		for(int i=n-1;i>=2;i--)
    			if(Tim[i]>Max[i]) Lin[i-1].Nex=Lin[i].Nex;
    			else Lin[i-1].Nex=i;
    		for(int i=1;i<=n;i++) Lin[i].Val=Sum[Lin[i].Nex]-Sum[i];
    		Region Now=(Region){0,0,-1};
    		for(int i=1;i<n;i++) if(Now.Val<Lin[i].Val&&D[i]) Now=Lin[i];
    		if(!Now.Val) break;ans-=Now.Val; D[Now.Id]--;Tim[1]=0;
    		for(int i=2;i<=n;i++) Tim[i]=D[i-1]+max(Tim[i-1],Max[i-1]);
    	}
    	printf("%lld",ans);
    }
    
  • 相关阅读:
    SQL进阶-索引设置&sql优化
    SQL进阶-去重
    SQL进阶-隐式类型转换
    SQL进阶-行转列&列转行
    用Spring实现文件上传(CommonsMultipartFile)!
    在Maven父项目下创建子项目
    Maven下把父项目下的子项目导出到myeclipse中
    oracle数据库的导入导出命令
    配置环境变量
    Nginx反向代理的配置
  • 原文地址:https://www.cnblogs.com/wo-shi-zhen-de-cai/p/11734357.html
Copyright © 2020-2023  润新知