zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    【Azure】创建4层SLB运行网站
    【Azure】高可用方案
    【Azure】 微软云资源管理模式(Azure Resource Manager)
    JavaScript BOM
    JavaScript数组的属性和方法
    JavaScript parseFloat() 函数和parseInt()函数
    Javascript实现checkbox的全选
    设计一个含有一个表单的页面,并且在表单上放入一个文本框。编写程序,当鼠标在页面上移动时,鼠标的坐标将显示在这个文本框中。
    如何在页面完全加载后执行JS
    如何让脚本的执行顺序按照你设定的顺序执行
  • 原文地址:https://www.cnblogs.com/AbandonZHANG/p/2598279.html
Copyright © 2011-2022 走看看