【发布时间】:2020-02-23 19:21:52
【问题描述】:
我正在解决一个问题,QuestionsLink,我们得到了一个名称和一个整数。您必须打印三个具有最大整数值的名称。
因此,我将数字转换为字符串并将其连接在名称之前。排序后,我得到了想要的结果。但它失败了一些测试用例,这让我很好奇 c++ 中的排序函数是如何工作的。
这是我的代码:
#include <bits/stdc++.h>
#define ll long long int
using namespace std;
int main() {
ll n;
cin >> n;
string names[n];
int arr[n], digits[n];
for (int i = 0; i < n; i++) {
cin >> names[i] >> arr[i];
names[i] = to_string(arr[i]) + names[i];
}
for (int i = 0; i < n; i++) {
digits[i] = floor(log10(arr[i]) + 1);
}
sort(names, names + n, greater<string>());
for (int i = 0; i < n; i++) {
cout << names[i] << endl;
}
/*for(int i=0;i<3;i++){
string s = names[i].substr(digits[i],names[i].length());
cout<<s<<endl;
}
cout<<digits[98];
*/
return 0;
}
测试用例:
9huDmy
995YnAYoAEE
990RUTM
96ipORo
956LNjFa
所以,在按降序排序后,9huDmy 如何在顶部,而接下来的两个是根据它们前面的数字排序的。
【问题讨论】:
-
'h'(104) 的 ASCII 码大于'9'(57) 或任何其他数字的 ASCII 码。这就是为什么。 -
不要使用
#include <bits/stdc++.h>(Why should I not #include <bits/stdc++.h>?),使用小写字母定义 (#define ll long long int) 会导致许多意想不到的问题,请改用using(using ll = unsigned long long;)。动态大小数组 (string names[n]) 不是标准 c++,而是使用标准容器的扩展。 -
我想在@T.niese 中扩展:不要使用“竞争性编码”环境来学习一门语言(任何语言)。竞争性编码在所有错误的地方进行了优化,而 DE 强调了您在“真实”程序中想要的那些东西——可读性、可维护性、模块化。