zoukankan      html  css  js  c++  java
  • 5.10 省选模拟赛 拍卖 博弈 dp

    LINK:拍卖

    avatar
    avatar

    比赛的时候 前面时间浪费的有点多 写这道题的时候 没剩多少时间了。

    随便设了一个状态 就开始做了。

    果然需要认真的思考。其实 从我的状态的状态转移中可以看出所有的结论。

    这里 就不再赘述我那个爆零代码了.

    一下把 有价值的东西简称为1 无价值的东西简称为 0

    结论1:容易想到 答案一定是0,1串。考虑证明 当不存在k这个限制的时候 在先手 两次拿到1之间 后手一定可以拿到一个1 否则后手就拿先手的第二个1.

    考虑存在k的时候 到达k之前有Vf>=Vs 如果此时前面的都选了 那么和上述局面一样。

    如果没有选够 若此时Vf+1==Vs 那么此时必然后手为先手 那么根据上述局面 后手此时最多比先手多1 然后和之前抵消掉就变成0了。

    反之 还是先手为先手 那么和上述局面一致。

    所以先手最多比后手多拿1个.

    结论2:显然先手不会拿0物品 那么那样转换先后手了 且自己价值没有增加且局面更差.

    结论3:先手遇到1就会拿 如果没有拿 那么跟刚才的局面一样 且自己的价值降低了 拿的话局面不会比不拿差.

    至此可以得到先手的策略 有1就拿遇到0就跳。

    不需要得到后手的策略 因为只有先手拿过 后手才能拿 且此时后手变成先手。

    当存在有k的情况 我们已知了 先手一定拿1遇到0跳过 此时 后手有拿0的机会且局面不会更差。

    如果后手有一个不拿0 那么其实答案可以直接计算出来 即 到达k时前面的1的个数的奇偶性。

    但是 可能后手有可能拿0 此时就是博弈问题了 我们不知道后手究竟拿不拿0.

    一个dp 设f[i][j]表示对于[i,n]k值为j的胜者是先手还是后手0/1。对于先手的胜利显然为Vf-Vs=1 对于后手的胜利显然为Vf-Vs=0.

    这样 利用刚才的先手的策略很容易退出状态转移方程. 暴力dp 就得到了40 points.

    const int MAXN=5010;
    int n,Q;
    int f[MAXN][MAXN];
    char a[MAXN];
    int main()
    {
    	//freopen("1.in","r",stdin);
    	gt(n);gt(Q);gc(a);
    	fep(n,1,i)
    	{
    		rep(1,n-i+1,j)
    		{
    			if(a[i]=='1')f[i][j]=f[i+1][j-1]^1;
    			else 
    			{
    				if(j==n-i+1)f[i][j]=f[i+1][j-1];
    				else f[i][j]=min(f[i+1][j-1],f[i+1][j]);
    			}
    		}
    	}
    	rep(1,Q,i)put(f[1][read()]);
    	return 0;
    }
    

    由于状态是01 可以利用bitset来进行优化。

    这样可以获得60 points.

    const int MAXN=100010;
    int n,Q;
    char a[MAXN];
    bitset<MAXN>s;
    int main()
    {
    	//freopen("1.in","r",stdin);
    	gt(n);gt(Q);gc(a);
    	fep(n,1,i)
    	{
    		if(a[i]=='1')s=(s<<1).flip(),s[0]=0;
    		else 
    		{
    			int ww=s[n-i];
    			s=(s<<1)&s;
    			s[n-i+1]=ww;
    		}
    	}
    	rep(1,Q,i)
    	{
    		int x;gt(x);
    		int ww=s[x];
    		put(ww);
    	}
    	return 0;
    }
    

    100分的话需要利用平衡树来优化这个过程 不过我不太会写.

    先咕了.

  • 相关阅读:
    ajax长轮询实现即时聊天室
    node.js 通过post上传图片并显示
    Java集合类详解
    多行子查询
    Oracle中查看用户下面所有表的语句
    关于Oracle的create
    Oracle数据库学习
    oracle数据库
    js 中 undefined、NaN、null
    学习数据库SQL语句2
  • 原文地址:https://www.cnblogs.com/chdy/p/12890609.html
Copyright © 2011-2022 走看看