BestCoder 2nd Anniversary/HDU 5718 高精度 模拟

Oracle

Accepts: 599
Submissions: 2576
Time Limit: 8000/4000 MS (Java/Others)
Memory Limit: 262144/262144 K (Java/Others)
问题描述
曾经有一位国王,统治着一片未名之地。他膝下有三个女儿。

三个女儿中最年轻漂亮的当属Psyche。她的父亲不确定她未来的命运,于是他来到Delphi神庙求神谕。

神谕可以看作一个不含前导零的正整数n n n。

为了得到真正的预言,他可以将n n n的各个数位重新排列,并将其分成两个不含前导零的正整数。

请你帮助他求出这两个正整数最大的和。如果不存在这样的两个正整数,输出"Uncertain".
输入描述
第一行一个整数T  (1≤T≤10) (1 le T le 10) (1T10),代表数据组数。

接下来T 行,每行一个正整数n (1≤n<1010000000) (1 le n < 10 ^ {10000000}) (1n<1010000000​​)。
输出描述
对于每组数据,输出一个整数表示最大的和。若不存在一种方案,输出"Uncertain".
输入样例
3
112
233
1
输出样例
22
35
Uncertain
Hint
对于第一组数据,最优方案是将112 112 112分成21 21 21和1 1 1,最大的和为21+1=22 21 + 1 = 22 21+1=22。

对于第二组数据,最优方案是将233 233 233分成2 2 2和33 33 33,最大的和为2+33=35 2 + 33 = 35 2+33=35。

对于第三组数据,显然无法将一个数位分成两部分。

建议使用效率较高的读入方式。

题意:bc两周年 中文题意 将一个整数(1e10000000) 各个数位重新排列,并将其分成两个不含前导零的正整数。使得和最大 并输出最大的和

题解:分为两个不含前导零的整数 若整数中不为零的位数小于2则无法满足条件则输出Uncertain
分析可知 将这个整数分为 一个数只含有一位非零的最小的数 另一个数按照从大到小的顺序排列使得数最大 然后大数模拟求和

 1 #include<iostream>
 2 #include<cstring>
 3 #include<cstdio>
 4 #include<queue>
 5 #include<stack>
 6 #include<vector>
 7 #include<map>
 8 #include<algorithm>
 9 #define ll __int64
10 #define mod 1e9+7
11 #define PI acos(-1.0)
12 using namespace std;
13 const int  inf =  (1<<30) - 10;
14 int t;
15 char a[10000005];
16 int b[10000005];
17 int ans[10000005];
18 int main()
19 {
20     scanf("%d",&t);
21     for(int i=1;i<=t;i++)
22     {
23         cin>>a;
24         int minx=10;
25         int len=strlen(a);
26         int flag=0;
27         for(int j=0;j<len;j++)
28         {
29             if(a[j]!='0')
30                 flag++;
31             b[j]=a[j]-'0';
32             if(b[j])
33             minx=min(minx,b[j]);
34         }
35         if(flag<2)
36             {
37                 cout<<"Uncertain"<<endl;
38                 continue;
39             }
40         sort(b,b+len);
41         int flg=0;
42         int zha=0;
43         int be=minx;
44         for(int j=0;j<len;j++)
45         {
46             if(b[j]==minx&&flg==0)
47             {
48 
49                 zha=j;
50                 flg=1;
51                 continue;
52             }
53             ans[j]=(be+b[j])%10;
54             be=(be+b[j])/10;
55         }
56       if(be)
57         cout<<be;
58       for(int j=len-1;j>zha;j--)
59         cout<<ans[j];
60       for(int j=zha-1;j>=0;j--)
61         cout<<ans[j];
62       cout<<endl;
63 
64     }
65   return 0;
66 }
 
原文地址:https://www.cnblogs.com/hsd-/p/5680705.html