第十二章 贪心 2 AcWing 1522. 排成最小的数字

浅浅的花香味﹌ 2024-03-31 13:48 179阅读 0赞

第十二章 贪心 2 AcWing 1522. 排成最小的数字

原题链接

AcWing 1522. 排成最小的数字

算法标签

贪心

思路

自定义排序方式
在这里插入图片描述
即a<b等价于ab(a位于b之前)<ba(b位于a之前)
按照该排序方式从小到大排序后所得字符串即为能排列出的最小数字

证明

在这里插入图片描述

自定义排序方式可以排序吗

自定义排序方式可以排序的充分必要条件为排序集合上有一全序关系
在这里插入图片描述
完全性证明
在这里插入图片描述
反对称性证明(双向箭头表明等价, 单向表明推到方向)
在这里插入图片描述
传递性证明
在这里插入图片描述

代码

  1. #pragma GCC optimize(2)
  2. #pragma GCC optimize(3)
  3. #include<bits/stdc++.h>
  4. #define int long long
  5. #define xx first
  6. #define yy second
  7. #define ump unordered_map
  8. #define us unordered_set
  9. #define pq priority_queue
  10. #define rep(i, a, b) for(int i=a;i<b;++i)
  11. #define Rep(i, a, b) for(int i=a;i>=b;--i)
  12. using namespace std;
  13. typedef pair<int, int> PII;
  14. const int N=10005, inf=0x3f3f3f3f3f3f3f3f, mod=1e9+7;
  15. const double Exp=1e-8;
  16. //int t, n, m, cnt, ans;
  17. string ss[N];
  18. char c[13];
  19. inline int rd(){
  20. int s=0,w=1;
  21. char ch=getchar();
  22. while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
  23. while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();
  24. return s*w;
  25. }
  26. void put(int x) {
  27. if(x<0) putchar('-'),x=-x;
  28. if(x>=10) put(x/10);
  29. putchar(x%10^48);
  30. }
  31. signed main(){
  32. ios::sync_with_stdio(false);
  33. cin.tie(0);
  34. cout.tie(0);
  35. int n=rd();
  36. rep(i, 0, n){
  37. scanf("%s", c);
  38. string s=c;
  39. ss[i]=s;
  40. }
  41. // 匿名函数相当于同时进行函数声明与调用声明与调用完成语句结束 结尾需要有分号
  42. sort(ss, ss+n, [](string a, string b){
  43. return a+b<b+a;
  44. });
  45. string res="";
  46. rep(i, 0, n){
  47. res+=ss[i];
  48. }
  49. int k=0;
  50. while(k+1<res.size()&&res[k]=='0'){
  51. k++;
  52. }
  53. printf("%s", res.substr(k).c_str());
  54. return 0;
  55. }

参考文献

AcWing 1522. 排成最小的数字(PAT甲级辅导课y总视频讲解)

原创不易
转载请标明出处
如果对你有所帮助 别忘啦点赞支持哈
在这里插入图片描述

发表评论

表情:
评论列表 (有 0 条评论,179人围观)

还没有评论,来说两句吧...

相关阅读