模拟赛笔记(1)
1、XR0210
T1:U105209 拼数(P1012 [NOIP1998 提高组] 拼数)
将数字串按照 $a+b>b+a$ 排序,如何证明全序关系?即求证:若 $a+b>b+a$,$b+c>c+b$,则 $a+c>c+a$。
证明:
设 $a$ 的位数为 $x$,$b$ 的位数为 $y$,$c$ 的位数为 $z$,则 $a+b=a\cdot10^y+b$,$b+a=b\cdot10^x+a$。
所以 $\dfrac{a}{10^x-1}>\dfrac{b}{10^y-1}$,同理可得 $\dfrac{b}{10^y-1}>\dfrac{c}{10^z-1}$,因此 $a+c>c+a$。
证毕。
注意是只选三个而不是全选,所以数字位数要作为第一关键字。
1 const int N = 1e6 + 10; 2 string a[N]; 3 4 inline bool cmp1(const string &a, const string &b) 5 { 6 return a.size() != b.size() ? a.size() > b.size() : a + b > b + a; 7 } 8 inline bool cmp2(const string &a, const string &b) 9 { 10 return a + b > b + a; 11 } 12 13 int main() 14 { 15 int n; cin >> n; 16 for (int i = 1; i <= n; ++i) cin >> a[i]; 17 sort(a + 1, a + n + 1, cmp1); sort(a + 1, a + 4, cmp2); 18 cout << a[1] << a[2] << a[3]; 19 fwrite(pbuf, 1, pp - pbuf, stdout); return 0; 20 }
To be continued...