zoukankan      html  css  js  c++  java
  • code1105 过河

    dp方程很简单:

    f[i] = min{ f[i-j] } + stone[i]

    但是数据10^9太大了,超时超空间,这样只能过30%

    来自:http://blog.csdn.net/w19960702123/article/details/40478187

    当我们看到10^9与100块石头,和s,t均小于等于10时,我们会想到有的石头间距可能大于t,即要跳好几步才会到达下一块石头的左右处。而我们会发现这些步数是无关紧要的,我们只需要把他们缩小,即在不影响最终结果的基础上mod一下t就行了。

    但是为什么要mod t呢?首先,我们可以知道,青蛙最多跳t,由于两石块间的间距远大于t,且这之间没有石头,所以青蛙会以最大的t去走,至少是在第i块石头向后t个距离,到第i+1块向前t个距离处,它会一直跳的(其实不跳t也可以,但是我们想最优,所以青蛙在中间如何跳是无所谓的,那么我们就可以把它极限化,即取t)

    解释完mod t,先一步就是推导如何计算了。

    既然我们要缩短距离L(L=b[i]-b[i-1])那么我们就需考虑,是不是L的每一个点都能缩。我们利用极限的思想,青蛙跃过一个石头,最多也就到b[i-1]+t处(同理,最少会到b[i] - t ),即 b[i-1]+t 到 b[i] - t 间的距离要缩减。

    综上,我们就可以得到一个公式a[i]=a[ i-1]+X , X=(b[i]-t-b[i-1]-t)%t (即缩点后的长度),但是我们怕X会小于t,这样会导致青蛙直接跳过这段距离,所以我们要再加t,即a[i]=a[ i-1]+(b[i]-b[i-1]-2*t)%t +t。

    注意:

    1.我们只有在L>t 时我们需要缩点

    2.不要忘记排序

    3.讨论s==t的情况

    代码:

    #include <iostream>  
    #include <cstdio>  
    #include <cstring>  
    #include <cmath>  
    #include <algorithm>   
    using namespace std;  
    int f[100000],a[105],b[105],stone[100000];  
    int L,s,t,m,ans;  
    int main()  
    {  
        cin>>L>>s>>t>>m;  
        for(int i=1;i<=m;i++)cin>>a[i];  
        a[0]=0;
        sort(a+1,a+m+1);  
        //特判
        if(s==t){  
            for(int i=1;i<=m;i++)if(a[i]%t==0)ans++;  
            cout<<ans;  
            return 0;  
        }
        //压缩 
        a[m+1]=L;
        for(int i=1;i<=m+1;i++){    
            if(a[i]-a[i-1]>t)  
                b[i]=b[i-1]+(a[i]-a[i-1]-2*t)%t+t;  
            else b[i]=b[i-1]+(a[i]-a[i-1]);
    //        cout<<b[i]<<endl; 
        } 
        L=b[m+1];
        
        memset(stone,0,sizeof(stone));
        for(int i=1;i<=m;i++)stone[b[i]]=1;
        f[0]=0;
        for(int i=1;i<=L+t-1;i++)f[i]=0x3f3f3f3f;
        //dp
        for(int i=1;i<L+t;i++)  
             for(int k=s;k<=t;k++)  
                 if(i-k>=0)f[i]=min(f[i-k]+stone[i],f[i]);
        //ans    
        ans=0x3f3f3f3f;  
        for(int i=L;i<L+t;i++)ans=min(ans,f[i]);  
        cout<<ans;
        
        return 0;  
    }
  • 相关阅读:
    How do you Design a Circular FIFO Buffer (Queue) in C?

    搞懂分布式技术5:Zookeeper的配置与集群管理实战
    Spring boot 启动提示数据源错误
    IntelliJ IDEA 如何配置数据源
    Windows 10 中你可能用得最多的快捷键
    JUnit 5 测试问题 throws java.lang.Exception’ must be static unless the test class is annotated with @TestInstance(Lifecycle.PER_CLASS)
    Intellij IDEA 如何自动生成 serialVersionUID
    Docsify 初始化文件夹
    Docsify 安装
  • 原文地址:https://www.cnblogs.com/FuTaimeng/p/5654162.html
Copyright © 2011-2022 走看看