HDU 6130 Kolakoski 打表
来源:互联网 发布:工资数据分析 编辑:程序博客网 时间:2024/06/05 15:44
题意是说有一个数组,1,2,2,1,1,2,1,2,2,1,2,2,1,1,2,1,1,2,2,1……,如果将这个数组相同的数字合并成一个数就会变成1,22,11,2,1,22,1,22,11,2,11,22,1……,然后再来看这个新数组每一个数字的位数,最后发现构成的数组就是一开始的数组1,2,2,1,1,2,1,2,2,1,2,2,1,1,2,1,1,2,2,1……,现在要求出这个数组第n个数。
这题找了找貌似没什么规律或者循环节可以直接找出第n位的数字,比赛时候看几乎没有人TLE,干脆直接打表来做了。先把前两个数确定下来为1,2,因为a[2]=2,所以一定可以知道对应的是两个数,那么a[3]也一定是等于2的,而a[3]=2,所以后面一定可以知道是两个1,具体有几个数直接用a[i]就可以往后直接进行赋值,然后后面的数因为不是1就是2,所以在确定了这个数之后,也可以马上找到后面的数,这样一直找下去,最后打表找出这个数组就可以了。
下面AC代码:
#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>using namespace std;int a[20000005];int init(){ int i,j; int k; int t; a[1]=1; a[2]=2; k=2; for(i=2;i<=10000000;i++) { //cout<<i<<" "<<a[i]<<endl; t=k+a[i]-1; for(j=k+1;j<=t;j++) { a[j]=a[j-1]; } k+=a[i]; if(a[k-1]==1) a[k]=2; else a[k]=1; } return 0;}int main(){ int T; int n; init(); scanf("%d",&T); while(T--) { scanf("%d",&n); cout<<a[n]<<endl; } return 0;}
阅读全文
2 0
- 【HDU 6130 Kolakoski】& Kolakoski & 打表
- HDU 6130 Kolakoski 打表
- HDU 6130-Kolakoski(Kolakoski序列)
- hdu-6130-Kolakoski
- HDU 6130 Kolakoski
- HDU 6130 Kolakoski
- HDU 6130-Kolakoski
- hdu-6130-Kolakoski
- hdu 6130 Kolakoski
- hdu 6130 Kolakoski
- HDU 6130 Kolakoski数列
- hdu 6130 Kolakoski
- HDU 6130 Kolakoski【】
- HDU 6130 Kolakoski
- HDU 6130 Kolakoski
- hdu 6130 Kolakoski
- HDU 6130 Kolakoski(数学)
- HDU 6130 Kolakoski【找规律】
- 0-1背包问题
- 2017.08.15【NOIP提高组】模拟赛B组 生日聚餐
- Leetcode-Longest Common Prefix-Python
- 谁说90后不靠谱?95后都做CEO了
- bzoj 3238 Ahoi2013 后缀数组+单调栈
- HDU 6130 Kolakoski 打表
- 2017年8月12日(模拟四(smoj2193,2194,2195)强连通分量、勾股定理探索、动态规划+容斥原理)
- 常用正则表达式大全,手机、电话、邮箱、身份证(最严格的验证)、IP地址、网址、日期等,一般前台js验证
- 【已解决】ubuntu插网线无法联网
- android相对布局中@id和@+id的区别(原理)
- 关于ETCD和Zookeeper的一些简单了解(转)
- Linux下安装Elasticsearch5.5
- Jmeter运行原理
- 【拜小白opencv】11-综合示例-两幅图像融合-摄像头采集图像-滑动条