【题目链接】:http://codeforces.com/problemset/problem/743/E

【题意】



给你n个数字;

这些数字都是1到8范围内的整数;

然后让你从中选出一个最长的子列;

要求这个子列中各个数字出现的次数的差的绝对值都不超过1;

且如果是相同的数字的话:

都是连在一起的(不会有分散的数字);

问你这个最长的序列的长度是多少;

【题解】



二分每个数字至少出现的次数x,(即最少出现x次,当然也可以是x+1次);

(单调性是显然的吧,因为如果每个数字出现5次是可行的话,那么3次肯定也是可以的,二分是正确的);

然后判断这样的序列存不存在;

可以一个数字一个数字的判断;

对于每个数字而言.

只有两种情况.在这个序列中,或者不在;

(想要加入到这个序列中,

则必须之前没有出现过,

因为题目有要求不能出现分散的块;

如果之前没有出现过;

则加入到这个序列中,

枚举它要出现x次,还是x+1次,

则可以写个lower_bound快速判断它之后的

第x个该数字(或是x+1)的位置,然后再从那个位置后一位开始,

继续选择,同时记录刚才那个数字已经加入到序列中;

(同时序列的长度递增x或是x+1)

当然也可以不选这个数字,则往后移动一位;

到了第n+1个位置的时候,看看是不是所有的8个数字都选了;

是的话则返回找到了一个序列,否则返回一个很小的值就好;

这些都用记忆化搜索写吧.

开个

f[i][s],表示当前扫描到第i个位置,当前选择的数字的状态为s;(二进制对应);

的最大序列长度;

bo[i][s]记录这个状态有没有找过.

i最大1000,s最大2^8=256

状态这么少,怎么样都不会超啦;

然后如果能找到x的序列,就尝试把x搞大一点,继续找;

然后x为0的情况没办法在做记搜的时候体现出来;

得自己一开始的时候预处理出ans



【Number Of WA】



0



【完整代码】

#include <bits/stdc++.h>
using namespace std;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define LL long long
#define rep1(i,a,b) for (int i = a;i <= b;i++)
#define rep2(i,a,b) for (int i = a;i >= b;i--)
#define mp make_pair
#define pb push_back
#define fi first
#define se second
#define ms(x,y) memset(x,y,sizeof x)
#define Open() freopen("F:\\rush.txt","r",stdin)
#define Close() ios::sync_with_stdio(0),cin.tie(0) typedef pair<int,int> pii;
typedef pair<LL,LL> pll; const int dx[9] = {0,1,-1,0,0,-1,-1,1,1};
const int dy[9] = {0,0,0,-1,1,-1,1,-1,1};
const double pi = acos(-1.0);
const int N = 1100;
const int MM = 1<<8;
const int INF = -0x3f3f3f3f; int n,a[N],mark,ans,f[N][MM+10];
bool bo[N][MM+10];
vector <int> v[10]; int dfs(int i,int s,int x)
{
if (bo[i][s]) return f[i][s];
bo[i][s] = true;
if (i>n)
{
if (s==MM-1)
{
return f[i][s] = 0;
}
else
return f[i][s] = INF;
}
int ret = INF;
if (!((s>>(a[i]-1))&1))
{
int pos = lower_bound(v[a[i]].begin(),v[a[i]].end(),i)-v[a[i]].begin();
if (pos+x-1<int(v[a[i]].size()))
{
ret = max(ret,x+dfs(v[a[i]][pos+x-1]+1,s|(1<<(a[i]-1)),x));
}
if (pos+x<int(v[a[i]].size()))
{
ret = max(ret,x+1+dfs(v[a[i]][pos+x]+1,s|(1<<(a[i]-1)),x));
}
}
f[i][s] = max(ret,dfs(i+1,s,x));
return f[i][s];
} bool ok(int x)
{
ms(f,INF);
ms(bo,0);
int ret = INF;
ret = max(ret,dfs(1,0,x));
ans = max(ans,ret);
if (ret>=0)
return 1;
else
return 0;
} int main()
{
//Open();
Close();//scanf,puts,printf not use
//init??????
cin >> n;
rep1(i,1,n)
{
cin >> a[i];
if(!((mark>>a[i])&1))
{
mark|=(1<<a[i]);
ans++;
}
v[a[i]].pb(i);
}
int l = 1,r = n/8;
while (l<=r)
{
int mid = (l+r)>>1;
if (ok(mid))
l = mid+1;
else
r = mid-1;
}
cout << ans << endl;
return 0;
}

【codeforces 743E】Vladik and cards的更多相关文章

  1. 【35.02%】【codeforces 734A】Vladik and flights

    time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...

  2. 【codeforces 546C】Soldier and Cards

    time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...

  3. 【44.64%】【codeforces 743C】Vladik and fractions

    time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard ou ...

  4. 【CodeForces - 546C】Soldier and Cards (vector或队列)

    Soldier and Cards 老样子,直接上国语吧  Descriptions: 两个人打牌,从自己的手牌中抽出最上面的一张比较大小,大的一方可以拿对方的手牌以及自己打掉的手牌重新作为自己的牌, ...

  5. 【codeforces 415D】Mashmokh and ACM(普通dp)

    [codeforces 415D]Mashmokh and ACM 题意:美丽数列定义:对于数列中的每一个i都满足:arr[i+1]%arr[i]==0 输入n,k(1<=n,k<=200 ...

  6. 【codeforces 777B】Game of Credit Cards

    [题目链接]:http://codeforces.com/contest/777/problem/B [题意] 等价题意: 两个人都有n个数字, 然后两个人的数字进行比较; 数字小的那个人得到一个嘲讽 ...

  7. 【27.85%】【codeforces 743D】Chloe and pleasant prizes

    time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...

  8. 【47.40%】【codeforces 743B】Chloe and the sequence

    time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard ou ...

  9. 【codeforces 707E】Garlands

    [题目链接]:http://codeforces.com/contest/707/problem/E [题意] 给你一个n*m的方阵; 里面有k个联通块; 这k个联通块,每个连通块里面都是灯; 给你q ...

随机推荐

  1. apache 与 nginx 详解

    Apache与Nginx的优缺点比较 1.nginx相对于apache的优点: 轻量级,同样起web 服务,比apache 占用更少的内存及资源 抗并发,nginx 处理请求是异步非阻塞的,而apac ...

  2. git常规使用的命令

    注: xxxx代表你的分支名称   1:本地新建一个分支,与远程分支关联: git branch --set-upstream-to origin/xxxx xxxx   2:创建本地分支: git ...

  3. 路由器一键桥接Android实现

    開始之前,首先说一下什么叫一键桥接,所谓一键桥接,就是点击一下.就能够对所连接的路由器进行网络中继设置.以实现路由器能够通过已有的无线路由器进行网络訪问. 那么实现这个功能有几种方法呢?能够说有非常多 ...

  4. Spring Data MongoDB 五:进阶文档查询(分页、Morphia)(二)

    Spring Data MongoDB 三:基本文档查询(Query.BasicQuery)(一) 学习MongoDB 六: MongoDB查询(游标操作.游标信息)(三) 一.简单介绍 Spring ...

  5. bzoj1786: [Ahoi2008]Pair 配对&&1831: [AHOI2008]逆序对

    一个自以为很对的东西,我们往-1放的数肯定是不增的. 然后就预处理一下,假如i这个位置放j会多多少逆序对. DP一下,我的复杂度应该是O(n*m^2)的,然而你随便搞都能省掉一个m吧,我算了算好像可以 ...

  6. python中类的定义、实例化、封装以及私有变量/方法

    1.  定义类 python中定义一个类的格式如下: class MyClass(object): def __init__(self,data1,data2): self.__data1=data1 ...

  7. Java专业技能面试问题(不定时更新)

    刚看到园友五月的仓颉<面试感悟----一名3年工作经验的程序员应该具备的技能>感觉很不错,不论是为面试跳槽准备,还是打算深化精进自己的技术都可以参考一下.面向工资编程多少也有点道理,虽然技 ...

  8. LigerUI 单独调用插件使用注意项

    LigerUI 再某些情况下只需要使用部分功能,并不需要调用 ligerui.all.js . 比喻: 我现在只想用ligerGrid功能 只需要调用 <link href="lige ...

  9. v-cli环境的安装

    第一步:node   npm是node的包管理器  yarn 第二步:npm install -g vue-cli或者淘宝镜像                  如果安装失败:在node.js com ...

  10. 从极大似然估计的角度理解深度学习中loss函数

    从极大似然估计的角度理解深度学习中loss函数 为了理解这一概念,首先回顾下最大似然估计的概念: 最大似然估计常用于利用已知的样本结果,反推最有可能导致这一结果产生的参数值,往往模型结果已经确定,用于 ...