Oracle
Accepts: 599
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) (1≤T≤10),代表数据组数。
接下来T 行,每行一个正整数n (1≤n<1010000000) (1 le n < 10 ^ {10000000}) (1≤n<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 }