Twilight的卡牌游戏

Twilight的卡牌游戏

来源:http://acm.xidian.edu.cn/

题目

Twilight最近在玩某种无聊的卡牌游戏,游戏的规则是这样的:
初始有n张牌,编号为1-n,依次放在位置1-n上。玩家从第一个回合开始对卡牌进行抽取,
如果当前是奇数回合,抽出所有在2的倍数的位置上的卡牌,剩下的卡牌向小编号方向靠拢;
如果当前是偶数回合,抽出所有在3的倍数的位置上的卡牌,剩下的卡牌向小编号方向靠拢。
当某个回合抽取完毕后剩下的卡牌数不超过三张时,则游戏结束,剩下的卡牌的初始编号之和即为游戏得分。
Twilight有点厌倦了一次一次手动抽取卡牌,他希望你能直接告诉他,对于给定的n,最后剩下的卡牌编号是多少。

输入

输入包含多组数据。每组数据占一行,包含不超过100000个字母、下划线、字符“[”或者“]”。其中字符“[”表示Home键,“]”表示End键。输入结束标志为文件结束符(EOF)。输入文件不超过5MB。

输出

一共T行,分别对应输入的卡牌数,每行从小到大输出剩下的卡牌的编号,编号之间以一个空格间隔。

输入样例

2
10
40

输出样例

1 7
1 19 37

解题思路

给定个数n,执行一系列操作后,要求剩下最多三个数。可以先计算总共需要执行操作的次数times。然后在times次内,对1~n每个数进行判断是否最后会留下。注意输出格式。

参考代码

#include<stdio.h>
int main(){
    int T;
    scanf("%d",&T);
        while(T--){
            int n;
        scanf("%d",&n);
        int m=n;
        int times=0;
        while(m>3){
            if(times%2==0){
                m=m-(m/2);
                times++;
            }else{
                m=m-(m/3);
                times++;
            }
        }
        int space=0;
        for(int i=1;i<=n;i++){
            int cnt=0;
            int t=i;
            int flag=1;
            while(cnt<times){
                if(cnt%2==0){
                    if(t%2==0){
                        flag=0;
                        break;
                    }
                    t=t-(t/2);
                }else{
                    if(t%3==0){
                        flag=0;
                        break;
                    }
                    t=t-(t/3);
                }
                cnt++;
            }
            if(t!=0 && flag){
                if(space!=0)
                    printf(" ");
                printf("%d",i);
                space++;
            }
        }
        printf("\n");
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/wingrez/article/details/80428545