zoukankan      html  css  js  c++  java
  • HDU3595_GG and MM

    /*
    *State:  HDU3595    62MS    272K    1262 B    C++
    *题目大意:
    *        给定两个整数,两人轮流从较大的数中减去较小数的倍数(所有的结果数都非0)。
    *        直到不能再减者为输。而且有n个游戏同时进行。
    *解题思路:
    *        先用gcd来求出谁胜谁负,当第一个出现a % b == 0 || a / b > 2的时候,这轮选
    *        手就胜利,然后要记录路径,由最后的胜者来根据记录的路径来计算这一局的次数。
    *        由于是n个游戏同时进行,而且可以走就要走光所有,所以只需记录最长的那一局
    *        即是答案。
    *解题感想:
    *        gcd函数里面的vec.push_back()忘了加一个else,结果wa了3次,拖了半天。
    */
    View Code
      1 #include <iostream>
      2 #include <stdio.h>
      3 #include <vector>
      4 using namespace std;
      5 
      6 int cnt, first, flag, Max, res;
      7 vector<int> vec;
      8 
      9 int count()
     10 {
     11     int tol = 1, f = first;
     12 
     13     for(int i = vec.size() - 2; i >= 0; i--)
     14     {
     15         f = 1 - f;
     16         if(vec[i] == 1)
     17         {
     18             tol++;
     19         }
     20         else
     21         {
     22             if(f == first)
     23                 tol++;
     24             else
     25             {
     26                 tol += 2;
     27                 f = 1 - f;
     28             }
     29         }
     30     }
     31     return tol;
     32 }
     33 
     34 void gcd(int a, int b)
     35 {
     36     if(a % b == 0 || a / b > 1)
     37     {
     38         vec.push_back(a / b);
     39         if(!flag)
     40         {
     41             if(!(cnt & 1))
     42                 first = 1;
     43             flag = 1;
     44         }
     45         if(a % b == 0)
     46         {
     47             int tmp = count();
     48             if(Max < tmp)
     49             {
     50                 Max = tmp;
     51                 res = first;
     52             }
     53             return ;
     54         }
     55     }
     56     else
     57         vec.push_back(1);
     58     cnt++;
     59     gcd(b, a % b);
     60 }
     61 
     62 void init()
     63 {
     64     cnt = flag = 0;
     65     first = 0;
     66     vec.clear();
     67 }
     68 
     69 int main(void)
     70 {
     71 #ifndef ONLINE_JUDGE
     72     freopen("in.txt", "r", stdin);
     73 #endif
     74 
     75     int n;
     76     while(scanf("%d", &n) == 1)
     77     {
     78         Max = 0, res = 0;
     79         for(int i = 0; i < n; i++)
     80         {
     81             init();
     82             int a, b;
     83             scanf("%d %d", &a, &b);
     84             if(a < b)
     85             {
     86                 a = a ^ b;
     87                 b = a ^ b;
     88                 a = a ^ b;
     89             }
     90             if(!(a && b))
     91                 continue;
     92             gcd(a, b);
     93         }
     94         if(res)
     95             printf("MM\n");
     96         else
     97             printf("GG\n");
     98     }
     99     return 0;
    100 }
  • 相关阅读:
    Hdu 5396 Expression (区间Dp)
    Lightoj 1174
    codeforces 570 D. Tree Requests (dfs)
    codeforces 570 E. Pig and Palindromes (DP)
    Hdu 5385 The path
    Hdu 5384 Danganronpa (AC自动机模板)
    Hdu 5372 Segment Game (树状数组)
    Hdu 5379 Mahjong tree (dfs + 组合数)
    Hdu 5371 Hotaru's problem (manacher+枚举)
    Face The Right Way---hdu3276(开关问题)
  • 原文地址:https://www.cnblogs.com/cchun/p/2613750.html
Copyright © 2011-2022 走看看