BestCoder 2nd Anniversary A hdu 5718 模拟



链接:戳这里


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;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值