浴谷P1012 拼数+P1019 单词接龙 (字符串)

本文介绍了两个编程题目,一个是通过排序构造最大整数,另一个是单词接龙游戏,寻找最长的单词序列。对于前者,关键在于自定义排序函数,确保数字拼接的最大化;后者则需考虑单词重叠最少,实现最长序列。代码示例和解题思路详述。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目一(拼数)

设有 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 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值