zoukankan      html  css  js  c++  java
  • HDU

    http://acm.hdu.edu.cn/showproblem.php?pid=5920

    http://www.cnblogs.com/xudong-bupt/p/4015226.html

    把前半部分复制过去,如果太大,那么早到第一个会使得其太大的点,减1,然后对应的中间的变成9

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <cmath>
    #include <algorithm>
    #include <vector>
    #include <queue>
    #include <string>
    #include <stack>
    #include <map>
    #include <set>
    #include <bitset>
    #include <cstdlib>
    #include <ctime>
    #define X first
    #define Y second
    #define clr(u,v); memset(u,v,sizeof(u));
    #define in() freopen("3.h","r",stdin);
    #define out() freopen("ans","w",stdout);
    #define Clear(Q); while (!Q.empty()) Q.pop();
    #define pb push_back
    using namespace std;
    typedef long long ll;
    typedef pair<int, int> pii;
    const ll INF = 1e17;
    const int inf = 0x3f3f3f3f;
    const int maxn = 1e3 + 20;
    char nxt[maxn], str[maxn];
    bool is(char str[], int lenstr) {
        int i = 1, j = lenstr;
        while (i < j) {
            if (str[i] != str[j]) return false;
            ++i;
            --j;
        }
        return true;
    }
    void bigCut(char str[], char sub[], char str3[]) {
        int lenstr = strlen(str + 1), lensub = strlen(sub + 1);
    //    printf("%d
    ", lenstr);
        for (int i = 1; i <= lenstr; ++i) str[i] -= '0';
        for (int i = 1; i <= lensub; ++i) sub[i] -= '0';
        int use = lenstr;
        for (int i = lensub; i >= 1; --i, --use) {
            if (str[use] < sub[i]) {
                str[use] = 10 + str[use] - sub[i];
                int p = use - 1;
                while (p >= 1 && !str[p]) {
                    str[p] = 9;
                    p--;
                }
                str[p]--;
            } else str[use] -= sub[i];
        }
        for (int i = 1; i <= lenstr; ++i) str[i] += '0';
        int to = 0;
        int p = 1;
        while (p < lenstr && str[p] == '0') p++;
        while (p <= lenstr) {
            str3[++to] = str[p++];
        }
        str3[++to] = '';
    }
    char s2[2222];
    void findNxt(char str[], int lenstr) {
        if (is(str, lenstr)) {
            strcpy(nxt + 1, str + 1);
            return;
        }
        if (str[1] == '1') {
            bool flag = true;
            for (int i = 2; i <= lenstr; ++i) {
                if (str[i] != '0') {
                    flag = false;
                    break;
                }
            }
            if (flag) {
                for (int i = 1; i <= lenstr - 1; ++i) nxt[i] = '9';
                nxt[lenstr] = '';
                return;
            }
        }
        for (int i = 1,j=lenstr; i <=j; ++i,--j) {
            s2[j] = s2[i] = str[i];
        }
        for (int i = lenstr / 2 + 1; i <= lenstr; ++i) {
            if (str[i] < s2[i]) {
                for(int j=(lenstr+1)/2;;j--)
                {
                    if(s2[j]=='0')
                    {
                        s2[j]='9';
                        s2[lenstr-j+1]=s2[j];
                    }
                    else
                    {
                        s2[j]--;
                        s2[lenstr-j+1]=s2[j];
                        break;
                    }
                }
                break;
            }
        }
        for (int i = 1; i <= lenstr; ++i) nxt[i] = s2[i];
        nxt[lenstr + 1] = '';
    }
    
    char res[2222];
    char sub[222] = "01";
    vector<string> vc;
    int f;
    void work() {
        printf("Case #%d:
    ", ++f);
        vc.clear();
        scanf("%s", str + 1);
        int lenstr = strlen(str + 1);
    //    findNxt(str, lenstr);
    //    printf("%s
    ", nxt + 1);
        while (true) {
            findNxt(str, lenstr);
            if (strcmp(str + 1, nxt + 1) == 0) {
                if (is(str, lenstr)) {
                    vc.push_back(str + 1);
                    break;
                } else {
                    vc.push_back("1");
                    sub[0] = '0';
                    sub[1] = '1';
                    sub[2] = '';
                    bigCut(str, sub, res);
                    strcpy(str + 1, res + 1);
                    lenstr = strlen(str + 1);
                    continue;
                }
            }
            vc.push_back(nxt + 1);
            bigCut(str, nxt, res);
            strcpy(str + 1, res + 1);
            lenstr = strlen(str + 1);
        }
        printf("%d
    ", vc.size());
        for (int i = 0; i < vc.size(); ++i) {
            printf("%s
    ", vc[i].c_str());
        }
    }
    
    int main()
    {
        #ifdef LOCAL
        in();
        #else
        #endif
        int t;
        scanf("%d", &t);
        while (t--) work();
        return 0;
    }
    View Code

    贪心的思路是:最好不要更改前半部分,权值大。

  • 相关阅读:
    Binary Search Tree Iterator 解答
    Invert Binary Tree 解答
    Min Stack 解答
    Trapping Raining Water 解答
    Candy 解答
    Jump Game II 解答
    Implement Hash Map Using Primitive Types
    Gas Station 解答
    Bucket Sort
    HashMap 专题
  • 原文地址:https://www.cnblogs.com/liuweimingcprogram/p/7401134.html
Copyright © 2011-2022 走看看