链接:戳这里
Oracle
Time Limit: 8000/4000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others)
问题描述
曾经有一位国王,统治着一片未名之地。他膝下有三个女儿。
三个女儿中最年轻漂亮的当属Psyche。她的父亲不确定她未来的命运,于是他来到Delphi神庙求神谕。
神谕可以看作一个不含前导零的正整数 n。
为了得到真正的预言,他可以将 n的各个数位重新排列,并将其分成两个不含前导零的正整数。
请你帮助他求出这两个正整数最大的和。如果不存在这样的两个正整数,输出"Uncertain".
输入描述
第一行一个整数 T (1≤T≤10),代表数据组数。
接下来 T T行,每行一个正整数 n (1≤n<1e10000000)。
输出描述
对于每组数据,输出一个整数表示最大的和。若不存在一种方案,输出"Uncertain".
输入样例
3
112
233
1
输出样例
22
35
Uncertain
Hint
对于第一组数据,最优方案是将 112 分成 21 和 1 ,最大的和为21+1=22。
对于第二组数据,最优方案是将 233分成 2和 33,最大的和为2+33=35。
对于第三组数据,显然无法将一个数位分成两部分。
建议使用效率较高的读入方式。
思路:
当字符串长度为1或者不为0的个数出现一次则无解
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<string>
#include<vector>
#include <ctime>
#include<queue>
#include<set>
#include<map>
#include<stack>
#include<iomanip>
#include<cmath>
#define mst(ss,b) memset((ss),(b),sizeof(ss))
#define maxn 0x3f3f3f3f
#define MAX 1000100
///#pragma comment(linker, "/STACK:102400000,102400000")
using namespace std;
char s[10000010];
int num[10];
int anw[10000100];
int main(){
int T;
scanf("%d",&T);
while(T--){
mst(num,0);
scanf("%s",s);
int n=strlen(s);
if(n==1){
cout<<"Uncertain"<<endl;
continue;
}
for(int i=0;i<n;i++){
int x=s[i]-'0';
num[x]++;
}
int y=0;
for(int i=1;i<=9;i++){
for(int j=1;j<=num[i];j++){
y=i;
num[i]--;
break;
}
if(y) break;
}
/*int x=0;
for(int i=0;i<=1;i++){
for(int j=1;j<=num[i];j++){
x=i;
break;
}
if(x) break;
}*/
int f=-1,cnt=0;
for(int i=0;i<=9;i++){
for(int j=1;j<=num[i];j++){
anw[cnt++]=i;
f=i;
}
}
if(f==-1 || (f==0 && cnt==1) || anw[cnt-1]==0){
cout<<"Uncertain"<<endl;
continue;
}
int t=0;
anw[0]+=y;
while(anw[t]>=10){
anw[t+1]++;
anw[t]%=10;
t++;
}
if(t==cnt) cnt++;
for(int i=cnt-1;i>=0;i--) cout<<anw[i];
cout<<endl;
}
return 0;
}