zoukankan      html  css  js  c++  java
  • 2015ACM/ICPC亚洲区沈阳站重现赛HDU5512Pagodasgcd

    n pagodas were standing erect in Hong Jue Si between the Niushou Mountain and the Yuntai Mountain, labelled from 1 to n. However, only two of them (labelled aand b, where 1abn) withstood the test of time.

    Two monks, Yuwgna and Iaka, decide to make glories great again. They take turns to build pagodas and Yuwgna takes first. For each turn, one can rebuild a new pagodas labelled i (i{a,b} and 1in) if there exist two pagodas standing erect, labelled j and k respectively, such that i=j+k or i=jk. Each pagoda can not be rebuilt twice.

    This is a game for them. The monk who can not rebuild a new pagoda will lose the game.
     
    Input
    The first line contains an integer t (1t500) which is the number of test cases.
    For each test case, the first line provides the positive integer n (2n20000) and two different integers a and b.
     
    Output
    For each test case, output the winner (``Yuwgna" or ``Iaka"). Both of them will make the best possible decision each time.
     
    Sample Input
    16
    2 1 2
    3 1 3
    67 1 2
    100 1 2
    8 6 8
    9 6 8
    10 6 8
    11 6 8
    12 6 8
    13 6 8
    14 6 8
    15 6 8
    16 6 8
    1314 6 8
    1994 1 13
    1994 7 12
     
    Sample Output
    Case #1: Iaka
    Case #2: Yuwgna
    Case #3: Yuwgna
    Case #4: Iaka
    Case #5: Iaka
    Case #6: Iaka
    Case #7: Yuwgna
    Case #8: Yuwgna
    Case #9: Iaka
    Case #10: Iaka
    Case #11: Yuwgna
    Case #12: Yuwgna
    Case #13: Iaka
    Case#14: Yuwgna
    Case #15: Iaka
    Case #16: Iaka
     
    今天的周赛题,没有写的原因一是因为英文没看懂,而是因为以为是博弈题,博弈我不太会,所以这题也就没做。
     

    题意:

      给出t组样例,每一组给出n、i、j,i和j表示其中两座塔的高度,要求Iaka和Yuwgna两人轮流造塔,Yuwgna先造,要求塔的高度只能是从已造的塔中进行i+j和i-j进行选择,不能和之前已造的塔高重复,且塔高<=n,求出最后一个造塔的人。

    思路:

    在塔全部造完之后,已造的塔的最小塔高是i和j的最小公约数minn,可以通过#include<algorithm>下的__gcd(i,j)求得,其他的塔高一定是minn的倍数。

    利用sum记录minn和其倍数(在minn到n的范围内),再减去原有的两座塔的数量即可。

    最后由于Yuwgna先造,所以sum%2==0的话说明Iaka赢,反之Yuwgna赢。

     1 #include<stdio.h>
     2 #include<algorithm>
     3 using namespace std;
     4 
     5 int main()
     6 {
     7     int tt;
     8     scanf("%d",&tt);
     9     int t=1;
    10     while(tt--)
    11     {
    12         int n,i,j;
    13         scanf("%d %d %d",&n,&i,&j);
    14         int minn=__gcd(i,j);
    15         int sum=-2;
    16         for(int i=minn;i<=n;i++)
    17         {
    18             if(i%minn==0)
    19                 sum++;
    20         }
    21         if(sum%2==0)
    22             printf("Case #%d: Iaka\n",t++);
    23         else
    24             printf("Case #%d: Yuwgna\n",t++);
    25     }
    26     return 0;
    27 }
    View Code
  • 相关阅读:
    平衡二叉树 JAVA实现 亲测可用
    八大排序算法 JAVA实现 亲自测试 可用!
    Java 函数传入参数后,究竟发生了什么?java函数传参数原理解析
    运行错误:应用程序无法启动因为并行配置不正确。the application has failed to start because its side-by-side configuration is incorrect 解决方法
    mysql在linux下修改存储路径
    redis订阅与发布系统
    PHP Math常量
    PHP Math函数
    php 字符串函数
    PHP数组函数
  • 原文地址:https://www.cnblogs.com/OFSHK/p/11482881.html
Copyright © 2011-2022 走看看