首页 > 其他分享 >P1012 [NOIP1998 提高组] 拼数

P1012 [NOIP1998 提高组] 拼数

时间:2024-02-14 21:22:05浏览次数:26  
标签:arr return 拼数 str2 str1 P1012 NOIP1998 it2 it1

[NOIP1998 提高组] 拼数

题目描述

设有 \(n\) 个正整数 \(a_1 \dots a_n\),将它们联接成一排,相邻数字首尾相接,组成一个最大的整数。

输入格式

第一行有一个整数,表示数字个数 \(n\)。

第二行有 \(n\) 个整数,表示给出的 \(n\) 个整数 \(a_i\)。

输出格式

一个正整数,表示最大的整数

样例 #1

样例输入 #1

3
13 312 343

样例输出 #1

34331213

样例 #2

样例输入 #2

4
7 13 4 246

样例输出 #2

7424613

提示

对于全部的测试点,保证 \(1 \leq n \leq 20\),\(1 \leq a_i \leq 10^9\)。

NOIP1998 提高组 第二题

2.题解

2.1 sort函数

思路

使用字典序排列,考虑到存在34,346,341这种前缀相同,但 34634 > 34346, 34134 < 34341,由较短的首位和较长的前缀的后一位的大小决定谁前谁后

代码

#include<bits/stdc++.h>
using namespace std;
bool cmp(string str1, string str2){
	auto it1 = str1.begin();
	auto it2 = str2.begin(); 
	while(it1 != str1.end() && it2 != str2.end()){
		if(*it1 > *it2) return true;
		else if(*it1 < *it2) return false;
		it1++; it2++;
	}
	if(str1.length() == str2.length()) return true;
	else if(it1 == str1.end()){
		it1 = str1.begin();
		if(*it1 < *it2) return false;
		else return true;
	}
	else if(it2 == str2.end()){
		it2 = str2.begin();
		if(*it1 < *it2) return false;
		else return true;
	}
}
int main(){
	int n;
	cin >> n;
	vector<string> arr(n);
	for(int i = 0; i < n; i++){
		cin >> arr[i];
	}
	sort(arr.begin(), arr.end(), cmp);
	string ans = "";
	for(int i = 0; i < n; i++){
		ans += arr[i];
	}
	cout << ans;
}

2.2 简化

思路

return str1 + str2 > str2 + str1; 一步解决

代码

#include<bits/stdc++.h>
using namespace std;
bool cmp(string str1, string str2){
  return str1 + str2 > str2 + str1;
}
int main(){
	int n;
	cin >> n;
	vector<string> arr(n);
	for(int i = 0; i < n; i++){
		cin >> arr[i];
	}
	sort(arr.begin(), arr.end(), cmp);
	string ans = "";
	for(int i = 0; i < n; i++){
		ans += arr[i];
	}
	cout << ans;
}

标签:arr,return,拼数,str2,str1,P1012,NOIP1998,it2,it1
From: https://www.cnblogs.com/trmbh12/p/18015623

相关文章

  • P10125 「Daily OI Round 3」Simple题解
    原题传送门题目概述:给我们一个字符串,不区分大小写,让我们判断此字符串是与Acoipp等价,还是与Svpoll等价,或者是与前两者都不等价,并按题目条件输出。思路分析:我们只需要把此字符串的第一个字符转成大写,其他字符转成小写,并与那两个字符串进行比较就行了代码:#include<bits/st......
  • P10125 「Daily OI Round 3」Simple 题解
    题目传送门简单模拟,主要考察字符串。首先输入一个char类型的数组,然后直接遍历每一位是否为Acoipp或Svpoll即可。//Simple//codeby:cq_irritater//time:2024/02/04#include<bits/stdc++.h>usingnamespacestd;chara[10];intmain(){//freopen("c......
  • 洛谷题单指南-排序-P1012 [NOIP1998 提高组] 拼数
    原题链接:https://www.luogu.com.cn/problem/P1012题意解读:通过某种合理的排序方式,使得排序后的数字连在一起最大。解题思路:此题关键在于排序,对于两个数字,哪个数字应该排在前面呢?1、思考误区很容易想到,给定两个数abcd、xyz,先比较第一位a和x,谁大谁排前面,一直到c和z。再来看d,这......
  • [NOIP1998 普及组] 三连击
    [NOIP1998普及组]三连击题目背景本题为提交答案题,您可以写程序或手算在本机上算出答案后,直接提交答案文本,也可提交答案生成程序。题目描述将共个数分成组,分别组成个三位数,且使这个三位数构成的比例,试求出所有满足条件的个三位数。输入格式无输出格式若干行,每行个......
  • P1010 [NOIP1998 普及组] 幂次方(十进制转二进制)(递归)
    P1010[NOIP1998普及组]幂次方个人感想终于能真正自主解决一道纯递归题目了,完成前面那次P1928外星密码的遗憾了十进制转化二进制再处理也顺利搞定(之前洛谷月赛就有相似题目,当时觉得很难就没写,太亏了)十进制转二进制样例:inta[]while(n!=0){ if(n%2==1){ a......
  • [NOIP1998 普及组] 阶乘之和
    [NOIP1998普及组]阶乘之和题目描述用高精度计算出()。其中!表示阶乘,定义为。例如,。输入格式一个正整数。输出格式一个正整数,表示计算结果。样例#1样例输入#13样例输出#19提示【数据范围】对于的数据,。【其他说明】注,《深入浅出基础篇》中使用本题作为例题,但是其数据范围......
  • (C语言)1到50的阶乘之和列表,参考用,洛谷:P1009 [NOIP1998 普及组] 阶乘之和
    1到50列表,阶乘之和S=1!+2!+3!+⋯+n!(n≤50)1::12::33::94::335::1536::8737::59138::462339::40911310::403791311::4395471312::52295631313::674997711314::9392826831315::140160263631316::2232439252431317::37801182062031318::678038552634831319::12842......
  • P1009 [NOIP1998 普及组] 阶乘之和
    题目描述用高精度计算出 S=1!+2!+3!+\cdots+n!S=1!+2!+3!+⋯+n!(n\le50n≤50)。其中 ! 表示阶乘,定义为 n!=n\times(n-1)\times(n-2)\times\cdots\times1n!=n×(n−1)×(n−2)×⋯×1。例如,5!=5\times4\times3\times2\times1=1205!=5×4×3×2×1=......
  • 洛谷P1013 [NOIP1998 提高组] 进制位
    P1013[NOIP1998提高组]进制位P1013题目传送门这是一道提高+/省选-的蓝题,有亿点点难度,我们先分析一下。分析字母的数量等于进制的大小,判错的时候,可以看一下那个表格右下角的一个等腰三角形,就会发现有一个由两位字母组成的三角形。我们验算一下,对于\(L\),在该三角形的双位字......
  • P1012 [NOIP1998 提高组] 拼数
     题解:这道题最大的坑:32和321,32321>32132 1#include<bits/stdc++.h>2usingnamespacestd;3stringa[25];4boolcmp(conststring&a,conststring&b)5{6return(a+b>b+a);//这里太妙了7}8intmain()9{10int......