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 }
  • 相关阅读:
    [转载]NSDistributedNotificationCenter
    protobuf在IOS中的使用
    mac 下大dmg文件分割成多部分
    IOS 后台任务、多任务的理解2
    越狱iPhone、ipad通过网页安装ipa
    Android中的几种多线程实现
    Android多线程-AsyncTask异步任务
    2----IOS、Android数据存储方式
    Andriod 页面跳转传值
    svn 分支创建 合并
  • 原文地址:https://www.cnblogs.com/cchun/p/2613750.html
Copyright © 2011-2022 走看看