[CF题解] Simple Palindrome
这题写了半个小时还拉上了大佬
再写构造我是狗
1.题意简述
用\(a,e,i,o,u\)构造一个串 使串中的回文子序列最少
2.读题
这道题其实并不难,难就难在什么是"回文子序列"。看到题目的第一眼,我相信你想到的肯定是:
哦哦,这题简单,不就是让他回文部分最小吗,那我直接输出\(aeiouaeiou\)循环不就行了吗。
结果得到的结果:

你定睛一看,回文子序列()
3.解法
所以,这样怎么解呢
我们以\(n=7\)为例,以我们第一次的做法,得到的是\(aeiouae\) ,其中的回文子序列:

我们可以看到,因为一直重复,所以非常多,当数量增加时会更加明显
一种显而易见的做法,同样字母叠加到一起,构造串
仍然以\(n=7\)为例 ,以当前做法,得到的是\(aaeeiou\),其中的回文子序列

2<3,因此得证
还有一种特殊情况,那就是\(n<=5\),那就直接输出就行了
4.std
#include <bits/stdc++.h>
using namespace std;
string str(int num, string t)
{
string ret;
while (num != 0)
{
num--;
ret += t;
}
return ret;
}
void solve()
{
int n;
cin >> n;
int k = n / 5;
string ans = "";
ans += str(k, "a");
if (n % 5 != 0)
ans += 'a', n--;
ans += str(k, "e");
if (n % 5 != 0)
ans += 'e', n--;
ans += str(k, "i");
if (n % 5 != 0)
ans += 'i', n--;
ans += str(k, "o");
if (n % 5 != 0)
ans += 'o', n--;
ans += str(k, "u");
if (n % 5 != 0)
ans += 'u', n--;
cout << ans << endl;
}
int main()
{
int t;
cin >> t;
while (t--)
{
solve();
}
return 0;
}

浙公网安备 33010602011771号