zoukankan      html  css  js  c++  java
  • HDU-5718 Oracle

    Oracle

     
     Accepts: 599
     
     Submissions: 2576
     Time Limit: 8000/4000 MS (Java/Others)
     
     Memory Limit: 262144/262144 K (Java/Others)
    问题描述
    曾经有一位国王,统治着一片未名之地。他膝下有三个女儿。
    
    三个女儿中最年轻漂亮的当属Psyche。她的父亲不确定她未来的命运,于是他来到Delphi神庙求神谕。
    
    神谕可以看作一个不含前导零的正整数nn。
    
    为了得到真正的预言,他可以将nn的各个数位重新排列,并将其分成两个不含前导零的正整数。
    
    请你帮助他求出这两个正整数最大的和。如果不存在这样的两个正整数,输出"Uncertain".
    输入描述
    第一行一个整数TT (1 le T le 10)(1T10),代表数据组数。
    
    接下来TT行,每行一个正整数nn (1 le n < 10 ^ {10000000})(1n<1010000000)
    输出描述
    对于每组数据,输出一个整数表示最大的和。若不存在一种方案,输出"Uncertain".
    输入样例
    3
    112
    233
    1
    输出样例
    22
    35
    Uncertain
    Hint
    对于第一组数据,最优方案是将112112分成212111,最大的和为21 + 1 = 2221+1=22。
    
    对于第二组数据,最优方案是将233233分成223333,最大的和为2 + 33 = 352+33=35。
    
    对于第三组数据,显然无法将一个数位分成两部分。
    
    建议使用效率较高的读入方式。

    解题思路:

    有两种解法,一种是O(nlogn)的一种是O(n)的

    O(nlogn)的解法比较好想,就是直接排个序就行,然后从后面向前面更新就行

    O(n)的解法也是比较简单的,就是直接计数排序就行。两个差别除了时空效率,写法区别并不大。

    比赛的时候我就直接写的O(nlogn)的。比较简单,也比较轻松。

    #include <map>
    #include <set>
    #include <stack> 
    #include <queue>
    #include <cstdio>
    #include <string>
    #include <vector>
    #include <cstring>
    #include <iostream>
    #include <algorithm>
    #include <functional>
    using namespace std;
    
    #define mod 7
    #define INF 0x3f3f3f3f
    #define lson (rt << 1)
    #define rson (rt << 1 | 1)
    #define Clear(a) memset(a, 0, sizeof(a))
    #define Max(a, b) ( (a) > (b) ? (a) : (b) )
    #define Min(a, b) ( (a) < (b) ? (a) : (b) )
    
    const int maxn = 1e7 + 5;
    const int dir[8][2] = {1,2, 2,1, -1,2, -2,1, 1,-2, 2,-1, -1,-2, -2,-1};
    
    char str[maxn]; 
    bool cmp(char a, char b){
        return a > b;
    }
    int main()
    {
        int t;
        scanf("%d", &t);
        while(t--){
            str[0] = '0';
            scanf(" %s", str + 1);
            int len = strlen(str + 1);
            if(len == 1){
                puts("Uncertain");
            }else{
                int cur = 0;
                sort(str + 1, str + len + 1, cmp);
                while(str[len-cur] == '0') ++cur;
                
                if(len - cur <= 1){
                    puts("Uncertain");
                }else{
                    for(int i = cur; i >= 1; --i){
                        swap(str[len-i], str[len-i+1]);
                    }
                    str[len-1] += str[len] - '0';
                    str[len] = 0;
                    for(int i = len - 1; i >= 0; --i){
                        if(str[i] - '0' >= 10){
                            str[i] -= 10;
                            str[i-1] += 1;
                        }
                    }
                    if(str[0] == '0') puts(str + 1);
                    else puts(str);
                }
            }
        }
        return 0;
    }


  • 相关阅读:
    c# 通过Windows服务启动外部程序
    MVC 视图页对数字,金额 用逗号 隔开(数字格式化)
    mvc4 @foreach 如何写@if 判断
    最小生成树Prim算法和Kruskal算法
    Triangle War
    定制kickstart重建CentOS7.5镜像用于U盘引导安装
    有限状态机FSM
    最短路经算法简介(Dijkstra算法,A*算法,D*算法)
    利用/dev/urandom文件创建随机数
    A*搜索算法
  • 原文地址:https://www.cnblogs.com/wiklvrain/p/8179464.html
Copyright © 2011-2022 走看看