zoukankan      html  css  js  c++  java
  • 不死的LYM NOIP模拟 二分+状压DP

    一共也就7种课,第7种可以贪心地选择一定睡觉以换取答案的最小值。

    那么我们就只剩下六种课需要讨论,状态压缩一下【当前的课之前睡过哪些课】即可。

    本题要在二分的check内写DP,用二分出来的疲劳极限作为限制条件。

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<climits>
    using namespace std;
    template<class T> inline void read(T &_a){
        bool f=0;int _ch=getchar();_a=0;
        while(_ch<'0' || _ch>'9'){if(_ch=='-')f=1;_ch=getchar();}
        while(_ch>='0' && _ch<='9'){_a=(_a<<1)+(_a<<3)+_ch-'0';_ch=getchar();}
        if(f)_a=-_a;
    }
    
    const int maxn=5001;
    long long n,c[maxn],js[maxn],zj[maxn],l,mid,r,init,dp[maxn][(1<<6)+5];
    
    inline bool check()
    {
        memset(dp,0x7f,sizeof(dp));
        dp[0][0]=init;
        for (register int i=1;i<=n;++i)
        {
            if(c[i]==7)
            {
                for (register int v=0;v<64;++v)
                    if (dp[i-1][v]<=mid) dp[i][v]=dp[i-1][v]-js[i];
                continue;
            }
            int symbol=(1<<(c[i]-1));
            for (register int v=0;v<64;++v)
            {
                if(v&symbol) { if(dp[i-1][v^symbol]<=mid) dp[i][v]=dp[i-1][v^symbol]-js[i]; }
                 else {
                    if(dp[i-1][v]<=mid) dp[i][v]=min(dp[i][v],dp[i-1][v]+zj[i]);
                    if(dp[i-1][v^symbol]<=mid) dp[i][v]=min(dp[i][v],dp[i-1][v^symbol]+zj[i]);
                }
            }
        }
        for (register int v=0;v<64;++v)
            if(dp[n][v]<=mid) return true;
        return false;
    }
    
    int main()
    {
        freopen("survive.in","r",stdin);
        freopen("survive.out","w",stdout);
        read(n);
        for (register int i=1;i<=n;++i) read(c[i]);
        for (register int i=1;i<=n;++i) read(js[i]);
        for (register int i=1;i<=n;++i) read(zj[i]),r+=zj[i];
        read(init); l=init; r+=l;
        long long ans;
        while(l<=r)
        {
            mid=(l+r)>>1;
            if(check()) ans=mid,r=mid-1;
             else l=mid+1;
        }
        printf("%lld",ans);
        fclose(stdin);
        fclose(stdout);
        return 0;
    }
  • 相关阅读:
    centos 7.5搭建oracle DG
    oracle 11g修改归档日志目录及大小
    oracle修改数据文件路径
    oracle 11g调优常用语句
    MySQL MHA安装配置
    mysql中的数据库操作
    mysql 中用户与权限的操作
    percona server安装
    mysql配置文件相关
    条件判断中的真假
  • 原文地址:https://www.cnblogs.com/jaywang/p/7745330.html
Copyright © 2011-2022 走看看