0
点赞
收藏
分享

微信扫一扫

洛谷AT315 おとぎの国の高橋君

想溜了的蜗牛 2022-01-24 阅读 21
c++ABCsort

传送门

题意翻译

题目描述

高桥君所住的AtCoder国,和我们一样,也普遍使用着10进制的10个阿拉伯数字(0-9)

但是,AtCoder国的数字的大小关系与我们普遍使用的数字的大小关系0<1<2<3<4<5<6<7<8<9不同。举例来说:当AtCoder国的数字从小到大为0<9<8<7<6<5<4<3<2<1的顺序时,在AtCoder国中8就比9大,而72也比97大。

给出AtCoder国的每个阿拉伯数字的大小关系,请将AtCoder国中的一些数按升序排列。

另外,和我们普遍使用的数字一样,AtCoder国中最小的数字一定是0。

这道题无头无脑都可以写出来一个程序(sort大法好)

#include<bits/stdc++.h>
using namespace std;
int a[20],n;
string str[1010];
bool cmp(string str1,string str2);
int main() {
	for(int i=1; i<=10; i++) cin>>a[i];
	cin>>n;
	for(int i=1; i<=n; i++) cin>>str[i];
	sort(str+1,str+n+1,cmp);
	for(int i=1; i<=n; i++) cout<<str[i]<<endl;

	return 0;
}

关键是cmp里写什么呢?

我们可以这样:

像阿拉伯数字一样,数位大的自然排在后面,小的排在前面

接下来就是数位一样的

就从最高位开始,找到第一个不同的数字(因为是string类型,所以要-'0')比较大小

完整代码:

#include<bits/stdc++.h>
using namespace std;
int a[20],n;
string str[1010];
bool cmp(string str1,string str2) {
	int len1=str1.size(),len2=str2.size();
	if(len1>len2) return false;//比数位
	if(len1<len2) return true;
	for(int i=0; i<len1; i++)
		if(str1[i]!=str2[i]) {//找第一个不同的数字
			for(int j=1; j<=10; j++) {
				if(str1[i]-'0'==a[j]) return true;//记得-'0'
				if(str2[i]-'0'==a[j]) return false;
			}
		}
	return str1>str2;//这里倒过来也行
}
int main() {
	for(int i=1; i<=10; i++) cin>>a[i];
	cin>>n;
	for(int i=1; i<=n; i++) cin>>str[i];
	sort(str+1,str+n+1,cmp);
	for(int i=1; i<=n; i++) cout<<str[i]<<endl;

	return 0;
}
举报

相关推荐

0 条评论