【題解】UVa 10935 【Throwing cards away I】

人生苦短,我用STL
这题也是个大水题,,,,用STL的队列模拟即可

注意需要特判n == 1的情况,,,这里好坑
最下面贴出当时与标程对拍的情况

#include<cstdio>
#include<queue>

class Solver{
public:
    void solve(int n){
        std::queue<int> Q;

        for(int i = 1;i <= n;i++){
            Q.push(i);//从1~n压入队列
        }

        printf("Discarded cards: ");//先输出提示信息
        while(Q.size() != 2){//当队列至少有2人
            printf("%d, ",Q.front());//扔掉第一个并输出
            Q.pop();

            int u = Q.front();//将现在的第一个弹出并且重新压入队列且不输出
            Q.pop();
            Q.push(u);
        }
        printf("%d\n",Q.front());//输出倒数第二个
        printf("Remaining card: %d\n",Q.back());//输出留下的一个
    }

    void main(){
        int n;
        while((scanf("%d",&n) == 1) && n){//特判n==1
            if(n == 1){
                printf("Discarded cards:\n");//那个冒号后面没有空格的2333333
                printf("Remaining card: 1\n");
            }else{
                solve(n);
            }
        }
    }
};

int main(){
    //freopen("in.txt", "r", stdin);
    //freopen("out2.txt","w",stdout);

    (new Solver) -> main();

    return 0;
}


下面是在Windows下与标程对拍的结果:
正在比较文件 out.txt 和 OUT2.TXT
***** out.txt(这是标程)
Discarded cards:
Remaining card: 1
***** OUT2.TXT(我的)
Discarded cards: (这里前面比标程多了一个空格)。。。
Remaining card: 1
*****