您的位置:首页 > 其它

多校7 HDU-6130 Kolakoski 构造数列 & 模拟

2017-08-16 00:07 423 查看
原题链接:

HDU-6130

大意:

生成 Kolakoski 序列,查询第 n 个数。

Kolakoski 满足很有意思的性质。 a[1]=2,a
表示第 n 个组有多少个数字(把连续的相同数字看成一组

前几个是

1,2,2,1,1,2,1,2,2,1,2,2,1,1,2,1,1,2,2,1,2,1,1,2,1,2,2,1,1,


分组后

1,22,11,2,1,22,1,22,11,2,11,22,1,2,11,2,1,22,11


即1,2 ,2, 1,1,2, 1,2, 2, 1, 2, 2,1,1,2,...


此外还有一些性质:

没有循环节没有通项公式无限数列、具体 wiki 上有很多。

思路:

这是一个构造题,准确地说是一个模拟题。。涉及到我的知识盲区了,有必要补一下,比赛的时候队友马上打掉了,当时就不再想了。

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define mem(s,t) memset(s,t,sizeof(s))
#define D(v) cout<<#v<<" "<<v<<endl
#define inf 0x3f3f3f3f
#define pb push_back
//#define LOCAL
inline void read(int &x){
x=0;char p=getchar();
while(!(p<='9'&&p>='0'))p=getchar();
while(p<='9'&&p>='0')x*=10,x+=p-48,p=getchar();
}

const int MAXN=2e7+10;
int a[MAXN];

a[1]=1;a[2]=2;
int v=2,j=2;
for(int i=2;i<MAXN-5;i++){
int len=a[i];
while(len){
a[j++]=v;
len--;
if(j>MAXN-5) break;
}
if(j>MAXN-5) break;
v=v%2+1;
}

int t;
read(t);
while(t--){
int n;
read(n);
printf("%d\n",a
);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息