zoukankan      html  css  js  c++  java
  • A. Polo the Penguin and Strings

    time limit per test
    2 seconds
    memory limit per test
    256 megabytes
    input
    standard input
    output
    standard output

    Little penguin Polo adores strings. But most of all he adores strings of length n.

    One day he wanted to find a string that meets the following conditions:

    1. The string consists of n lowercase English letters (that is, the string's length equals n), exactly k of these letters are distinct.
    2. No two neighbouring letters of a string coincide; that is, if we represent a string as s = s1s2... sn, then the following inequality holds,si ≠ si + 1(1 ≤ i < n).
    3. Among all strings that meet points 1 and 2, the required string is lexicographically smallest.

    Help him find such string or state that such string doesn't exist.

    String x = x1x2... xp is lexicographically less than string y = y1y2... yq, if either p < q and x1 = y1, x2 = y2, ... , xp = yp, or there is such number r (r < p, r < q), that x1 = y1, x2 = y2, ... , xr = yr and xr + 1 < yr + 1. The characters of the strings are compared by their ASCII codes.

    Input

    A single line contains two positive integers n and k (1 ≤ n ≤ 106, 1 ≤ k ≤ 26) — the string's length and the number of distinct letters.

    Output

    In a single line print the required string. If there isn't such string, print "-1" (without the quotes).

    Sample test(s)
    input
    7 4
    
    output
    ababacd
    
    input
    4 7
    
    output
    -1

    解题说明:此题是一道典型的贪心问题。既要保证字符串中随意两个连续字符串不同。也要保证字典序最小。最简单的想法是仅仅用a,b交替,在最后补上其它字符串就可以。

    #include<iostream>
    #include<cstdio>
    #include<cmath>
    #include<cstdlib>
    #include <algorithm>
    #include<cstring>
    #include<string>
    using namespace std;
    
    int main()
    {
    	int n, k, c, r, i;
    	scanf("%d%d", &n, &k);
    	if (k == n&&k <= 26)
    	{
    		c = 'a';
    		for (i = 0; i<k; i++)
    		{
    			printf("%c", c + i);
    		}
    		printf("
    ");
    	}
    	else if (k>n || k == 1)
    	{
    		printf("-1
    ");
    	}
    	else
    	{
    		for (i = 0; i<n - (k - 2); i++)
    		{
    			if (i % 2 == 0)
    			{
    				printf("a");
    			}
    			else
    			{
    				printf("b");
    			}
    		}
    		r = 2; 
    		c = 'a';
    		for (i; i < n; i++, r++)
    		{
    			printf("%c", c + r);
    		}
    		printf("
    ");
    	}
    	return 0;
    }
    


  • 相关阅读:
    搭建vue环境
    git常用命令整理
    highcharts 当Y轴全部没有数据的时候 数据标签显示最下面 而不是居中显示
    highcharts 不显示X轴 Y轴 刻度
    关于placeholder中 文字添加换行 用转义字符&#13;&#10;代替<br>
    highcharts 柱状图 折线图 混合 双纵轴显示
    单行、多行文字溢出 显示省略号
    Highcharts 饼图 文字颜色设置
    多行文本,垂直居中显示,文字超出高度显示省略号
    学习方法-5:比较学习法
  • 原文地址:https://www.cnblogs.com/tlnshuju/p/7026531.html
Copyright © 2011-2022 走看看