zoukankan      html  css  js  c++  java
  • bzoj 3830: [Poi2014]Freight【dp】

    参考:https://blog.csdn.net/zqh_wz/article/details/52953516
    妙啊
    看成分段问题,因为火车只能一批一批的走(易证= =)设f[i]为到i为止的车都走完来回了,转移显然是

    [f[i]=min{max(f[j]+i-j-1,a[i])+i-j-1+2*s} ]

    然后题解说这个j的取值是单调的,所以单增维护就行了(但是不会证单调)

    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    using namespace std;
    const int N=1000005;
    int n,s;
    long long f[N],a[N];
    int read()
    {
    	int r=0,f=1;
    	char p=getchar();
    	while(p>'9'||p<'0')
    	{
    		if(p=='-')
    			f=-1;
    		p=getchar();
    	}
    	while(p>='0'&&p<='9')
    	{
    		r=r*10+p-48;
    		p=getchar();
    	}
    	return r*f;
    }
    int main()
    {
        n=read(),s=read();
    	for(int i=1;i<=n;i++)
    		a[i]=read(),f[i]=1e18;
    	sort(a+1,a+1+n);
    	for(int i=2;i<=n;i++)
    		a[i]=max(a[i],a[i-1]+1);
    	int j=0;
    	for(int i=1;i<=n;i++,j--)
    		while(j<i&&max(f[j]+i-j-1,a[i])+i-j-1+2*s<f[i])
    			f[i]=max(f[j]+i-j-1,a[i])+i-j-1+2*s,j++;
    	printf("%lld
    ",f[n]);
        return 0;
    }
    
  • 相关阅读:
    多进程2
    并发编程
    粘包
    socket
    网络编程
    异常与网络编程
    面向对象高级
    多态
    面向对象2
    SQL数据库约束行为---防止数据乱填(即数据规范化)
  • 原文地址:https://www.cnblogs.com/lokiii/p/8947277.html
Copyright © 2011-2022 走看看