• Wannafly挑战赛28


    A.msc和mas

    题目描述

    msc有一天遇见了mas,于是他们开始玩游戏。
    msc和mas初始各有一个正整数A和B,并且他们共同设置了一个阈值L。
    然后游戏就开始了,对于每一局操作的人,假设他手上拿着的是数字x,对手手上拿着的是数字y(记这一局开始时y的数值为y0),那么:
    1、如果x>L,那么他就胜利了,否则进入步骤2
    2、他会给对手的数值加上x(即$ y + x  ightarrow y $),如果此时对手手上的数值y大于等于2y0,那么这一轮结束轮到对手操作,否则继续执行步骤2
    由于mas爱慕着msc,所以mas想知道当msc先手或后手时能否胜利。

    输入描述:

    一行三个正整数A,B和L,分别表示msc初始的数字,mas初始的数字和阈值。

    输出描述:

    一行两个字符串'Yes'或'No',分别表示msc先手以及后手时能否胜利,如果可以则输出'Yes',否则输出'No'(不包含单引号)。
    示例1

    输入

    232 42 9483

    输出

    No No

    备注:

    1≤ A,B,L≤ 10^9.
    解题思路:简单模拟一下即可。写完非递归后发现每次轮到对手时只是交换两个操作值x,y而已!!!于是就可用简单的尾递归来实现!!!
    AC代码一(非递归写法):
     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 typedef long long LL;
     4 LL A,B,C,x,y,k,tmp;bool f2,f4;
     5 int main(){
     6     while(cin>>A>>B>>C){
     7         f2=f4=false;x=A,y=B;
     8         while(1){
     9             if(!f2){///轮到msc,先手
    10                 if(x>C)break;
    11                 else{
    12                     k=y/x,tmp=y;
    13                     y+=k*x;
    14                     if(y<2LL*tmp)y+=x;
    15                 }
    16             }
    17             else{///轮到mas,后手
    18                 if(y>C)break;
    19                 else{
    20                     k=x/y,tmp=x;
    21                     x+=k*y;
    22                     if(x<2LL*tmp)x+=y;
    23                 }
    24             }
    25             f2=!f2;
    26         }
    27         x=A,y=B;
    28         while(1){
    29             if(!f4){///轮到mas,先手
    30                 if(y>C)break;
    31                 else{
    32                     k=x/y,tmp=x;
    33                     x+=k*y;
    34                     if(x<2LL*tmp)x+=y;
    35                 }
    36             }
    37             else{///轮到mcs,后手
    38                 if(x>C)break;
    39                 else{
    40                     k=y/x,tmp=y;
    41                     y+=k*x;
    42                     if(y<2LL*tmp)y+=x;
    43                 }
    44             }
    45             f4=!f4;
    46         }
    47         printf("%s %s
    ",!f2?"Yes":"No",f4?"Yes":"No");
    48     }
    49     return 0;
    50 }

    AC代码二(递归写法):

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 typedef long long LL;LL A,B,C,x;string obj[]={"No","Yes"};
     4 bool check(LL x,LL y,bool flag){
     5     if(x>C)return flag;
     6     return check((y/x+(y%x?1:0))*x+y,x,!flag);
     7 }
     8 int main(){
     9     while(cin>>A>>B>>C){
    10         cout<<obj[check(A,B,true)]<<' '<<obj[check(B,A,false)]<<endl;
    11     }
    12     return 0;
    13 }
  • 相关阅读:
    [HNOI2002]营业额统计 (Splay)
    [POJ1664] 放苹果 (动态规划,组合数学)
    [AHOI2009]维护序列 (线段树)
    类型转换求和
    懒人创造方法
    编程的精义
    10-instanceof
    9-接口
    6-SUPER关键字
    5-重写与重载
  • 原文地址:https://www.cnblogs.com/acgoto/p/9937864.html
Copyright © 2020-2023  润新知