• HDOJ 1271 整数对


    整数对

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
    Total Submission(s): 1492    Accepted Submission(s): 522

    Problem Description
    Gardon和小希玩了一个游戏,Gardon随便想了一个数A(首位不能为0),把它去掉一个数字以后得到另外一个数B,他把A和B的和N告诉了小希,让小希猜想他原来想的数字。不过为了公平起见,如果小希回答的数虽然不是A,但同样能达到那个条件(去掉其中的一个数字得到B,A和B之和是N),一样算小希胜利。而且小希如果能答出多个符合条件的数字,就可以得到额外的糖果。 
    所以现在小希希望你编写一个程序,来帮助她找到尽可能多的解。 
    例如,Gardon想的是A=31,B=3 告诉小希N=34, 
    小希除了回答31以外还可以回答27(27+7=34)所以小希可以因此而得到一个额外的糖果。
     
    Input
    输入包含多组数据,每组数据一行,包含一个数N(1<=N<=10^9),文件以0结尾。
     
    Output
    对于每个输入的N,输出所有符合要求的解(按照大小顺序排列)如果没有这样的解,输出"No solution."
     
    Sample Input
    34 152 21 0
     
    Sample Output
    27 31 32 126 136 139 141 No solution.
     
    Author
    Gardon
     
     
    分析:
    枚举去掉的是第几位:把答案分成两部分,abcd|ef   和   abc|ef  ,枚举去掉的是第几位,比如枚举的是d,前面的判断一下存不存在这样的abcd就行了, 然后后面的ef就可以求出来,
    比如123456
    abcd28
      abc28
    或者123456
    abcd78
      abc78
    而前面的abc则需要满足等式来求:abcdef+abcef=ABCDEF
    简化得:abcd+abc=ABCD(or+1)
    令x=abcd,即解方程 x+x/10=y ,因为解满足单调性,所以可以用二分求解方程,则最后求出来abcd,在加上已经算出来的ef就好了。

    #include <iostream>
    #include <vector>
    #include <algorithm>
    #define PB push_back
    using namespace std;
    int n;
    vector<int> ans;


    void calc(int x, int y, int z) {
        int st = 0, en = 999999999, mid;
        while (en - st > 1) {
            mid = (st + en) / 2;
            if (mid + mid / 10 >= y) en = mid;
            else st = mid;
        }
        for (; en + en / 10 == y; en++) ans.PB(en * z + x);
    }


    int main() {
        while (cin >> n, n) {
            ans.clear();
            int cur = 1;
            calc(0, n, 1);
            for (int i = 1; i <= 10; i++) {
                cur *= 10;
                int x = n % cur;
                if (x & 1) continue;
                calc(x / 2, n / cur, cur);
                calc(x / 2 + cur / 2, n / cur - 1, cur);
            }
            if (ans.size() == 0) cout << "No solution.\n";
            else {
                sort(ans.begin(), ans.end());
                for (int i = 0; i < ans.size() - 1; i++)
                    if (ans[i] != ans[i + 1]) cout << ans[i] << " ";
                cout << ans[ans.size() - 1] << endl;
            }
        }
        return 0;
    }
  • 相关阅读:
    Meten Special Activities II
    Meten Special Activities II
    Meten Special Activities II
    Meten Special Activities II
    Meten Special Activities
    Meten Special Activities
    Meten Special Activities
    Meten Special Activities
    Meten Special Activities
    冒泡排序和选择排序
  • 原文地址:https://www.cnblogs.com/AbandonZHANG/p/2598279.html
Copyright © 2020-2023  润新知