ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

bzoj4391 [Usaco2015 dec]High Card Low Card

2019-02-09 15:44:52  阅读:393  来源: 互联网

标签:Usaco2015 set iterator int 100100 bound High Card pl


传送门

分析

神奇的贪心,令f[i]表示前i个每次都出比对方稍微大一点的牌最多能赢几次

g[i]表示从i-n中每次出比对方稍微小一点的牌最多赢几次

ans=max(f[i]+g[i+1]) 0<=i<=n

虽然方案可能会重合但是这是可行的

1:因为限制比原题目宽,所以ans>=真实的答案

2:对于重复取的数a,如果集合中有个没取的数<a,那么在用小的赢的时候可以代替a

如果>a,那么在用大的赢时可以代替a

用set来记录最接近的数

代码

#include<bits/stdc++.h>
using namespace std;
set<int>a,b;
int f[100100],g[100100],is[100100],d[100100]; 
int main(){
    int n,m,i,j,k;
    scanf("%d",&n);
    for(i=1;i<=n;i++){
      scanf("%d",&d[i]);
      is[d[i]]=1;
    }
    for(i=1;i<=2*n;i++)
      if(!is[i]){
        a.insert(i);
        b.insert(-i);
      }
    for(i=1;i<=n;i++){
      set<int>::iterator pl=a.lower_bound(d[i]);
      if(pl!=a.end())a.erase(pl),f[i]=f[i-1]+1;
        else f[i]=f[i-1];
    }
    for(i=n;i>0;i--){
      set<int>::iterator pl=b.lower_bound(-d[i]);
      if(pl!=b.end())b.erase(pl),g[i]=g[i+1]+1;
        else g[i]=g[i+1];
    }
    int Ans=0;
    for(i=0;i<=n;i++)Ans=max(Ans,f[i]+g[i+1]);
    cout<<Ans<<endl;
    return 0;
}

标签:Usaco2015,set,iterator,int,100100,bound,High,Card,pl
来源: https://www.cnblogs.com/yzxverygood/p/10357519.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有