1072-ゲーム-こちらを探して


質問する



質問リンク:https://www.acmicpc.net/problem/1072

ポリシー

  • の勝率を計算する際には、100を乗じて100で割る方法を使用し、オーバーフローを回避するためにlong longで変数を宣言する必要があります.
  • の勝率が変わるかどうかを決定するには、rtにこれまでの回数を加えることができます.
  • ゲームの回数を加えると、最終的には二分探索で見つけることができます.
  • コード#コード#

    #include<cstdio>
    #include<algorithm>
    #include<vector>
    
    using namespace std;
    
    long long X, Y, Z;
    
    bool isChange(long long win, long long total){
        /// 여기서 win*100 하는 순간 오버플로우가 나올 수 있음 이런거 까지 생각해야함
        long long val = (win*100)/total;
        if(val > Z) return true;
        else return false;
    }
    int res = 2147000000;
    int BinarySearch(long long lt, long long rt){
        if(lt> rt){
            return res;
        }
        else{
            long long mid = (lt+rt)/2;
            if(isChange(Y+mid, X+mid)){
                if(mid < res) res = mid;
                return BinarySearch(lt, mid-1);
            }
            else{
                return BinarySearch(mid+1, rt);
            }
        }
    }
    
    int main(){
    
        // freopen("../input.txt","rt",stdin);
        
        scanf("%lld %lld",&X, &Y);
        Z = (Y*100)/X;
        int ret = BinarySearch(1, X);
        if(ret == 2147000000) printf("-1\n");
        else printf("%d\n",ret);
        return 0;
    }
    
    
    

    感想


    この問題はどうしてこの探求なのか.そう思います.しかし、よく考えて、なぜこの探求なのか考えてみましょう.また、平均値を求める場合は100を掛け、その場合はlong longを使います.
    これは間違いやすい問題だ.