• bzoj4391[Usaco2015 dec]High Card Low Card


    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=4391

    题目大意:

    奶牛Bessie和Elsie在玩一种卡牌游戏。一共有2N张卡牌,点数分别为1到2N,每头牛都会分到N张卡牌。

    游戏一共分为N轮,因为Bessie太聪明了,她甚至可以预测出每回合Elsie会出什么牌。

    每轮游戏里,两头牛分别出一张牌,点数大者获胜。

    同时,Bessie有一次机会选择了某个时间点,从那个时候开始,每回合点数少者获胜。

    Bessie现在想知道,自己最多能获胜多少轮?

    题解:

    贪心

    从1到n扫一遍,f[i]记录点数大的赢到i时最多能赢几轮

    反过来扫一遍,g[i]记录点数小的赢到i是最多能赢几轮

    用set来贪心得到f[]和g[]。

    这样f[i]+g[i+1]的最大值即为最终答案。

    很多人都会提到说可能一张牌在点数大的赢的时候被用了,后面改规则后也被用了,就被重复用了两次。但是其实没有关系。如果一张牌设为a被用了两次,那么就说明手中有一张牌设为b没有被用过。若a>b,那么在点数小的赢那轮可以用b去替代a来赢得胜利;反之亦然。

    #include<cstdio>
    #include<cstdlib>
    #include<cstring>
    #include<set>
    #include<algorithm>
    #include<iostream>
    using namespace std;
    #define maxn 50100
    #define ub upper_bound
    
    set<int> q,p;
    bool bo[maxn*2];
    int a[maxn],g[maxn],f[maxn];
    int mymax(int x,int y){return (x>y)?x:y;}
    int main()
    {
    	//freopen("cardgame.in","r",stdin);
    	//freopen("cardgame.out","w",stdout);
    	int n,i,ans=0;
    	scanf("%d",&n);
    	memset(bo,true,sizeof(bo));
    	for (i=1;i<=n;i++)
    	{
    		scanf("%d",&a[i]);
    		bo[a[i]]=false;
    	}
    	for (i=1;i<=2*n;i++) 
    	 if (bo[i]) p.insert(i),q.insert(-i);
    	//因为只能找到大于(等于)某数的最小值,所以要找小于某数的最大值就取相反数来找
    	for (i=1;i<=n;i++)
    	{
    		set<int>::iterator it=p.ub(a[i]);
    		if (it!=p.end()) {p.erase(*it);f[i]=f[i-1]+1;}
    		else f[i]=f[i-1];
    	}
    	for (i=n;i>=1;i--)
    	{
    		set<int>::iterator it=q.ub(-a[i]);
    		if (it!=q.end()) {q.erase(*it);g[i]=g[i+1]+1;}
    		else g[i]=g[i+1];
    	}
    	for (i=0;i<=n;i++)
    	 ans=mymax(f[i]+g[i+1],ans);
    	printf("%d
    ",ans);
    	return 0;
    }


  • 相关阅读:
    23. 霍纳法则(多项式求值快速算法)
    22. 欧几里德算法(求最大公约数GCD)
    [poj 2106] Boolean Expressions 递归
    [poj 1185] 炮兵阵地 状压dp 位运算
    [MOOC程序设计与算法二] 递归二
    [poj 3254] Corn Fields 状压dp
    [hdu 1074] Doing Homework 状压dp
    [hdu 1568] Fibonacci数列前4位
    [haut] 1281: 邪能炸弹 dp
    [hdu 2604] Queuing 递推 矩阵快速幂
  • 原文地址:https://www.cnblogs.com/Euryale-Rose/p/6527837.html
Copyright © 2020-2023  润新知