P12834 [蓝桥杯 2025 国 B] 项链排列
题目描述
小蓝有 AAA 颗蓝珠(用字符 ‘L’ 表示)和 BBB 颗桥珠(用字符 ‘Q’ 表示),他打算用这些珠子串成一条项链。他认为项链的美感主要体现在其视觉“变化”上:当项链中任意两个相邻的珠子种类不同时,就记为产生了一次“变化”。
为了系统地研究不同排列的美感,小蓝将每一种项链的排列方式表示为一个长度为 A+BA + BA+B 的字符串。这个字符串由 AAA 个字符 ‘L’ 和 BBB 个字符 ‘Q’ 组成。相应地,一条项链的“变化次数”即为这个字符串中,所有相邻且不相同的字符对的数目。
例如,如果项链的排列是“LLQLQ”,那么:
- 第 1 个 ‘L’ 和第 2 个 ‘L’ 相同,无变化。
- 第 2 个 ‘L’ 和第 3 个 ‘Q’ 不同,产生了 1 次变化。
- 第 3 个 ‘Q’ 和第 4 个 ‘L’ 不同,产生了 1 次变化。
- 第 4 个 ‘L’ 和第 5 个 ‘Q’ 不同,产生了 1 次变化。
排列“LLQLQ”的总“变化次数”为 3。
现在,小蓝希望找到一种项链排列,使其总“变化次数”恰好为 CCC。对此,请你帮他在所有满足这一条件的排列中,找出字典序最小的那一个。如果不存在任何满足条件的排列方式,则输出 -1。
输入格式
输入仅一行,包含三个整数 A,BA,BA,B 和 CCC,分别表示蓝珠数量、桥珠数量和目标变化次数。
输出格式
输出一个长度为 A+BA + BA+B 的字符串,表示字典序最小的满足条件的排列。如果不存在这样的排列,则输出 −1-1−1。
输入输出样例 #1
输入 #1
2 2 2
输出 #1
LQQL
输入输出样例 #2
输入 #2
2 2 3
输出 #2
LQLQ
输入输出样例 #3
输入 #3
2 2 4
输出 #3
-1
说明/提示
【评测用例规模与约定】
对于 20% 的评测用例,0≤A,B,C≤1000 \leq A, B, C \leq 1000≤A,B,C≤100,1≤A+B≤2001 \leq A + B \leq 2001≤A+B≤200。
对于 100% 的评测用例,0≤A,B,C≤1060 \leq A, B, C \leq 10^60≤A,B,C≤106,1≤A+B≤2×1061 \leq A + B \leq 2 \times 10^61≤A+B≤2×106。
C++实现
#include<bits/stdc++.h>
using namespace std;
int a,b,c;
signed main(void){
scanf("%d%d%d",&a,&b,&c);
if(min(min(a,b)*2,a+b-1)<c||(c==0&&a*b!=0)||(c!=0&&a*b==0)){
printf("%d\n",-1);
return 0;
}if(c%2==1){
c++;
int pl=a-c/2;
for(int i=0;i<pl;i++) cout<<'L';
for(int i=1;i<=c;i++){
cout<<(i%2==1?'L':'Q');
if(i%2==0) b--;
else a--;
}
for(int i=0;i<b;i++) cout<<'Q';
}else{
int pl=a-c/2;
bool flag=false;
if(pl<=0){
cout<<'Q';
b--;
flag=true;
}for(int i=1;i<pl;i++) cout<<'L';
for(int i=1;i<=c;i++){
cout<<(i%2==1?'L':'Q');
if(i%2==0) b--;
else a--;
}for(int i=0;i<b;i++) cout<<'Q';
if(!flag) cout<<'L';
}cout<<endl;
return 0;
}

后续
接下来我会不断用C++来实现信奥比赛中的算法题、GESP考级编程题实现、白名单赛事考题实现,记录日常的编程生活、比赛心得,感兴趣的请关注,我后续将继续分享相关内容

被折叠的 条评论
为什么被折叠?



