题解 B2057 【最高的分数】

· · 题解

题解

C++ 当中有一个函数 \verb!max! ,可以返回两个数当中更大的那个数。因此,我们设当前最大的数是 s ,每当读入一个数字 x 时,比较 sx 的大小;若后者大于前者就更新 s

小扩展

假如读入的数字非常大(比如有 100 位,这远远超过了整形的范围),我们就不能用常规的方式了。考虑将两个数字转换成两个字符串,并比较大小。

在 C++ 当中原生支持 \verb!string! 类型比较大小,但是这种比大小比较的是字典序(正如这个名字,字典序中字母顺序越小的越靠前),我们转化为整形的那种比较方式,就先比较它们的长度,显然一个长于/短于另一个都可以直接得出结果。而当且仅当位数相同时,比较字典序,就是数值上的大小关系了。

此外, \verb!max! 里面可以传入比较函数。比较函数比较的是 a 是否小于 b

参考代码

#include<bits/stdc++.h>
#define up(l,r,i) for(int i=l,END##i=r;i<=END##i;++i)
#define dn(r,l,i) for(int i=r,END##i=l;i>=END##i;--i)
using namespace std;
typedef long long i64;
const int INF =2147483647;
bool cmp(string a,string b){
    return a.length()<b.length()||(a.length()==b.length()&&a<b);
}
string s,x; int n;
int main(){
    cin>>n; up(1,n,i) cin>>x,s=max(s,x,cmp); cout<<s<<endl;
    return 0;
}