zoukankan      html  css  js  c++  java
  • PAT乙 1084. 外观数列 (20) C/C++

    1084. 外观数列 (20)

    时间限制
    400 ms
    内存限制
    65536 kB
    代码长度限制
    8000 B
    判题程序
    Standard
    作者
    CHEN, Yue

    外观数列是指具有以下特点的整数序列:

    d, d1, d111, d113, d11231, d112213111, ...
    

    它从不等于 1 的数字 d 开始,序列的第 n+1 项是对第 n 项的描述。比如第 2 项表示第 1 项有 1 个 d,所以就是 d1;第 2 项是 1 个 d(对应 d1)和 1 个 1(对应 11),所以第 3 项就是 d111。又比如第 4 项是 d113,其描述就是 1 个 d,2 个 1,1 个 3,所以下一项就是 d11231。当然这个定义对 d = 1 也成立。本题要求你推算任意给定数字 d 的外观数列的第 N 项。

    输入格式:

    输入第一行给出[0,9]范围内的一个整数 d、以及一个正整数 N(<=40),用空格分隔。

    输出格式:

    在一行中给出数字 d 的外观数列的第 N 项。

    输入样例:
    1 8
    
    输出样例:
    1123123111

    解析:这题有俩个地方很关键,一是整数d属于[0,9],第二个地方就是N<40.这代表着我们并不需要多么复杂的算法优化空间与时间,简单的暴力求解就可以解决。这题和字符串压缩解压类似,从头开始遍历,遇到相同字符时cnt+1,否则就保存已经连续几个相同字符。要注意最后要判断cnt是否大于0,防止字符串从头到尾都相等。

    代码如下:

    #include<iostream>
    using namespace std;
    int main()
    {
    	string a;
    	int n;
    	cin >> a >> n;
    	while(--n){
    		string ans;
    		char c = a[0];
    		int cnt = 0;
    		for(int i = 0;i < a.length();i++){
    			if(a[i] == c)	cnt++;
    			else{
    				ans+=c;
    				ans+=cnt+'0';
    				c = a[i];
    				cnt = 1;
    			}
    		}
    		if(cnt > 0){
    			ans+=c;
    			ans+=cnt+'0';
    		}
    		a = ans;
    	}
    	cout << a <<endl;
    	return 0;
    }

  • 相关阅读:
    P3811乘法逆元
    P4549裴蜀定理
    备用代码区
    其他板子整理
    DP
    图论板子整理
    约数
    浅谈假学习假努力
    质数
    P1019 单词接龙
  • 原文地址:https://www.cnblogs.com/long98/p/10352262.html
Copyright © 2011-2022 走看看