题目一(拼数)
设有 nn 个正整数 a_1 \dots a_na1…an,将它们联接成一排,相邻数字首尾相接,组成一个最大的整数。
输入格式
第一行有一个整数,表示数字个数 nn。
第二行有 nn 个整数,表示给出的 nn 个整数 a_iai。
输出格式
一个正整数,表示最大的整数
输入输出样例
输入
3 13 312 343
输出
34331213
输入
4 7 13 4 246
输出
7424613
解题思路
该题相对来说比较简单,是一个字符串拼接得到最大整数的问题。改代码的bool cmp判断很重要,判断的是a+b和b+a的字符串大小,而不是a和b字符串的大小,因为单独判断a和b的大小拼接出来的数字可能并不是最大值(例如521和52),进而再main函数里面用sort进行排序,输出结果。
代码如下
#include<iostream>
#include<algorithm>
#include<string>
using namespace std;
int n;
string s[20];
bool cmp(string a, string b) {
return a + b > b + a;
}
int main() {
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> s[i];
}
sort(s+1, s + n+1 , cmp);
for (int i = 1; i <= n; i++){
cout << s[i];
}
return 0;
}
运行结果如下:
题目二(单词接龙)
单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的“龙”(每个单词都最多在“龙”中出现两次),在两个单词相连时,其重合部分合为一部分,例如 beast
和 astonish
,如果接成一条龙则变为 beastonish
,另外相邻的两部分不能存在包含关系,例如 at
和 atide
间不能相连。
输入格式
输入的第一行为一个单独的整数 nn 表示单词数,以下 nn 行每行有一个单词,输入的最后一行为一个单个字符,表示“龙”开头的字母。你可以假定以此字母开头的“龙”一定存在。
输出格式
只需输出以此字母开头的最长的“龙”的长度。
输入输出样例
输入
5 at touch cheat choose tact a
输出
23
解题思路
该题要注重三点:1.每个单词最多用两次
2.单词可以不用完,长度越长越好
3.重叠部分越少越好,龙就越长
下面代码中有两个函数,其中xianjie函数两个字符串的连接,从1开始,连接两个最短的字符串,返回最小重叠部分的长度,在solve函数里进行搜索,获取最大的字符串长度。
代码如下
#include<iostream>
#include<algorithm>
#include<string>
using namespace std;
int a[20];
int n,length=0;
string s[20];
int xianjie(string s1,string s2){
for(int i=1;i<min(s1.length(),s2.length());i++){ //重叠的长度
int flag=1;
for(int j=0;j<i;j++)
if(s1[s1.length()-i+j]!=s2[j]) //检查字符串是否相等
flag=0;
if(flag==true)
return i;
}
return 0;
}
void solve(string str,int length1){
length=max(length1,length); //最大长度
for(int i=0;i<n;i++){
if(a[i]>=2) //使用的次数必须小于2
continue;
int c=xianjie(str,s[i]); //重叠的长度
if(c>0){ //进行搜索
a[i]++;
solve(s[i],length1+s[i].length()-c);
a[i]--;
}
}
}
int main(){
cin>>n;
for(int i=0;i<=n;i++){
a[i]=0;
cin>>s[i];
}
solve(' '+s[n],1); //xianjie函数需要重叠部分小于最短长度-1,所以要从前面添加一个无意义充长度的‘ ’。这样就强制了xianjie函数比较最后一位
cout<<length;
}
运行结果如下
大数据201 tyx