codeforces 1328B K-th Beautiful String 规律 水题

https://vjudge.net/problem/CodeForces-1328B

在这里插入图片描述在这里插入图片描述

题目大意:一个长度为 n n n的字符串,两个字符为 b b b,其余的字符均为 a a a,那么满足题意的不同的字符串有 n ∗ ( n − 1 ) / 2 n*(n-1)/2 n(n1)/2种,现在给定 k k k,求字典序第 k k k大的字符串。

思路:字典序越小肯定 b b b越靠后,比如最小的肯定是 a … b b a…bb abb,下一步把第一个 b b b前移一个位置,再下一步肯定就是把后面那个 b b b往前移动,举个例子,假设 n = 4 n=4 n=4时,有 6 6 6个不同的字符串,它们从小到大排序为: a a b b 、 a b a b 、 a b b a 、 b a a b 、 b a b a 、 b b a a aabb、abab、abba、baab、baba、bbaa aabbabababbabaabbababbaa。规律还是很容易看出来的。

#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
using namespace std;
typedef long long ll;

const int maxn=1e5+5;

int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        int n,k;
        scanf("%d%d",&n,&k);
        int idx1,idx2;
        for(int i=1;i<=n;i++)
        {
            if(k<=i)
            {
                idx1=i;
                break;
            }
            k-=i;
        }
        idx1=n-idx1;
        idx2=n+1-k;
        for(int i=1;i<=n;i++)
        {
            if(i==idx1||i==idx2)
                putchar('b');
            else
                putchar('a');
        }
        printf("\n");
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值