• 2月4日考试——欢乐斗地主


                    欢乐斗地主
                     时限:1s
                   内存限制:128MB
    题目描述:
      Ning_Mew 最近有玩欢乐斗地主(不能歧视我菜),脑子再次一热,就改成了一道很水很水的题。
    小 Mew 和朋友小 Ning 一起玩游戏,两个人轮流取纸牌,告诉你一共有 n 张纸牌,每次可以取 1~m 张,每
    次小 Mew 都可以先手(谁要他巨呢),假设两个人都是高智商,都只会去取最有可能赢的数量的牌。所以呢想要
    问你,小 Mew 第一次要取多少张牌才能稳赢~实在稳赢不了,就输出“She Pi Guai Wu!”(不包括引号)
    赢的定义就是取最后一张。_(:3 / )_
    读入格式:
    第一行:q(表示读入 q 行 n 与 m)----->多测
    第二至 q+1 行:每行读入 n,m
    输出格式:
    第一至 q 行:每行,如果能稳赢,输出第一次取的纸牌数量;否则,输出“She Pi Guai Wu!”(不包括引号)。
    样例输入:
    1
    42
    样例输出:
    1
    样例解释:
    这还要解释?
    数据范围:
    10%: q<=10
    n,m<=100
    40%: q<=100
    n,m<=1000
    60%: q<=1000
    n,m<=10000
    80%: q<=10000
    n,m<=10000
    100%: q<=100000 n,m<=1000000

    Solution:

      本题考察数学,实际上是小学奥数的推广。大家应该都还记得小学奥数中经典的分纸牌的游戏吧,就是给出54张牌,一次能拿1到4张牌,问先手第一次拿几张牌能赢。。。答案是先手拿4张牌,这样剩下50张牌,无论对手拿x张,我拿5-x张,最后一张牌一定是先手拿到。。。推及到本题,有n张牌,每次最多拿m张,那么若n%(m+1)==0,则先手必输(因为无论先手拿x张,后手都能拿到m+1-x张),若n%(m+1)!=0,则先手必赢,策略是先拿n%(m+1)张牌。

    代码:

     1 /*小学奥数中的分纸牌问题,开始还以为是nim游戏,打了个dp但数据呵呵——by 520*/
     2 #include<bits/stdc++.h>
     3 #define il inline
     4 #define ll long long 
     5 using namespace std;
     6 int n,m,q;
     7 il int gi()
     8 {
     9     int a=0;char x=getchar();bool f=0;
    10     while((x<'0'||x>'9')&&x!='-')x=getchar();
    11     if(x=='-')x=getchar(),f=1;
    12     while(x>='0'&&x<='9')a=a*10+x-48,x=getchar();
    13     return f?-a:a;
    14 }
    15 int main()
    16 {
    17     freopen("card.in","r",stdin);
    18     freopen("card.out","w",stdout);
    19     q=gi();
    20     while(q--){
    21         n=gi(),m=gi();
    22         if(n%(m+1))printf("%d
    ",n%(m+1));
    23         else printf("She Pi Guai Wu!
    ");
    24     }
    25     return 0;
    26 }
  • 相关阅读:
    BATJ面试必会之 Spring 篇(一)
    BATJ面试必会之Java IO 篇
    BATJ面试必会之并发篇
    如何学习JavaEE,项目又该如何做?
    面试官问你“有什么问题问我吗?”,你该如何回答?
    表单输入实时检测
    HTML5实现摇一摇
    加载音频Audio
    关于meta标签
    JS倒计时
  • 原文地址:https://www.cnblogs.com/five20/p/8413127.html
Copyright © 2020-2023  润新知