zoukankan      html  css  js  c++  java
  • BJTUOJ 1653 Wizard of Odds 思维, 码力

      题目链接: http://citel.bjtu.edu.cn/boj/problem.php?id=1653

      题目描述: 自己看吧, 懒得写了

      解题思路: 就是问一个10进制的数, 和一个2^k进制的数字谁大, 因为我觉得最快就是log2(n)了, 但是这个10进制的数是一个大数, 所以只能用字符串处理, 所以说这道题的关键就是用字符串模拟出十进制转二进制

    ------------------------------------分割线---------------------------------

    黑魔法......用double 表示长整数.......加上一个eps确保精度.......

       代码: 这个代码没有AC

    #include <iostream>
    #include <cstdio>
    #include <string>
    #include <cstring>
    #include <algorithm>
    using namespace std;
    
    const int MAXN = 105;
    char s1[MAXN];
    char s2[MAXN];
    int s3[MAXN];
    int ans[MAXN];
    int done;
    int cnt;
    int len1;
    
    int ok( int * temp ) {
        for( int i = 0; i < len1; i++ ) {
            if( temp[i] != 0 ) return 0;
        }
        return 1;
    }
    
    void div2( int * temp, int & mod ) {
        int flag = 0;
        for( int i = 0; i < len1; i++ ) {
            if( flag ) temp[i] += 10;
            if( temp[i] % 2 ) flag = 1;
            else flag = 0;
            temp[i] = temp[i] / 2;
        }
        mod = flag;
    }
    
    void solve( int * temp ) {
        
        if( done ) return;
        if( ok(temp) ) {
            done = 1;
            return;
        }
        int mod = 0;
        div2(temp, mod);
        ans[cnt++] = mod;
        solve(temp);
    }
    int main() {
        while( scanf( "%s%s", s1, s2 ) != EOF ) {
            memset(s3, 0, sizeof(s3));
            memset(ans, 0, sizeof(ans));
            done = 0;
            cnt = 0;
            len1 = (int)strlen(s1);
            int len2 = (int)strlen(s2);
            if( len2 >= 4 ) {
                cout << "Your wish is granted!" << endl;
                continue;
            }
            int num2 = atoi(s2);
            for( int i = 0; i < len1; i++ ) {
                s3[i] = (int)s1[i]-48;
            }
            solve(s3);
    //        for( int i = cnt-1; i >= 0; i-- ) {
    //            cout << ans[i] << " ";
    //        }
    //        cout << endl;
    //        cout << cnt-1 << " " << num2 << endl;
            if( cnt > num2+1 ) {
                cout << "You will become a flying monkey!" << endl;
            }
            else if( cnt < num2+1 ) {
                cout << "Your wish is granted!" << endl;
            }
            else {
                int flag = 1;
                for( int i = 1; i < cnt-1; i++ ) {
                    if( ans[i] != 0 ) {
                        flag = 0;
                        break;
                    }
                }
            
                if( !flag ) {
                    cout << "You will become a flying monkey!" << endl;
                }
                else {
                    cout << "Your wish is granted!" << endl;
                }
            }
        }
    }
    View Code

             AC 代码

    #include <iostream>
    #include <cstdio>
    #include <string>
    #include <cstring>
    #include <algorithm>
    #include <cmath>
    using namespace std;
     
    int main() {
        double n, k;
        while( cin >> n >> k ) {
            if( pow(2., k)+0.3 >= n ) {
                cout << "Your wish is granted!" << endl;
            }
            else {
                cout << "You will become a flying monkey!" << endl;
            }
        }
        return 0;
    }
    View Code

      思考: 我好像像个傻逼一样了......这题应该这么做?

          感觉自己像个智障, 这个黑魔法我确实没有想到, 但是正常按我的做法也是能够做出来的啊, 码力不够

  • 相关阅读:
    How to extend MySQLInnoDBDialect?
    Hibernate Session
    org/apache/xerces/xni/parser/XMLConfigurationException
    Hibernate.xml
    Oracle自带的sql developer导入导出数据 java程序员
    c#的DateTime.Now函数详解 java程序员
    [转]随着个性化数据带来的价值,为什么不销售你自己的数据?惠普实验室告诉你如何完成 java程序员
    [原]怎样在Eclipse中看到Android源码API java程序员
    HTML5的未来 HTML5 还能走多远? java程序员
    帮助你开发基于HTML5的网站原型页面 HTML5 Bones java程序员
  • 原文地址:https://www.cnblogs.com/FriskyPuppy/p/7258832.html
Copyright © 2011-2022 走看看