CF58D Calendar 题解
CF58D Calendar 题解
题目描述
题目解法
暴力题。
我们发现输出的字符串中除了每一行最后一个串没有分割字符,其余的都有。
并且每一行只会有两个字符串。
我们可以在每个输入的字符串后面加上分割字符后再进行排序,这样可以保证字典序最小。
每次枚举一个字符串,找到第一个可以和他组成符合条件的字符串,然后将他们输出。
C++ 的 string
是基于 vector
的,加上分割字符的操作可以 push_back()
,输出时将第二个字符串 pop_back()
即可。
由于 \(1\leq n\leq 10^4\),不需要使用二分,暴力枚举就能通过本题。
记得将使用过的字符串清空。
Code
#include<bits/stdc++.h>
using namespace std;
#define maxn 10004
string m[maxn];
int main()
{
ios::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
char c;
int n,s=0;
cin>>n;
for(int i=1;i<=n;i++)
cin>>m[i];
cin>>c;
for(int i=1;i<=n;i++)
m[i].push_back(c), s+=m[i].size();
int lrc=s*2/n;
sort(m+1, m+n+1);
for(int i=1;i<=n;i++)
for(int j=i+1;j<=n;j++)
if(m[i].size()+m[j].size()==lrc)
cout<<m[i],
m[j].pop_back(),
cout<<m[j]<<'\n',
m[i].clear(), m[j].clear();
}