ACM Uva10935 卡片游戏
题意如下
桌上n张牌(n<=50),从第一张(位于顶面的牌)开始,从上往下依次编号为1~n,当至少剩下两张牌时:丢掉第一张,然后把新的第一张放到整叠牌最后,输入每行包含一个n,输出每次扔掉的牌以及最后剩下的牌。
下面展示C++程序
#include<stdio.h>
#include<iostream>
#include<queue>
using namespace std;
#define _rep(i,a,b) for(int i = a;i <= b; i++) // 宏定义
int main(){int n;while(scanf("%d",&n) == 1 && n){queue<int> q;_rep(i,1,n) q.push(i);printf("移除的卡片:");bool first = true;while(q.size() >= 2){if(first){first = false;printf(" %d",q.front());}else printf(" ,%d",q.front());// 移除第一个并将移除后的第一个放入最后q.pop();q.push(q.front());q.pop();} printf("\n最后一张卡片: %d",q.front());} return 0;
}
结果显示:
参考:算法竞赛入门经典习题与解答 陈锋 编著
ACM Uva10935 卡片游戏
题意如下
桌上n张牌(n<=50),从第一张(位于顶面的牌)开始,从上往下依次编号为1~n,当至少剩下两张牌时:丢掉第一张,然后把新的第一张放到整叠牌最后,输入每行包含一个n,输出每次扔掉的牌以及最后剩下的牌。
下面展示C++程序
#include<stdio.h>
#include<iostream>
#include<queue>
using namespace std;
#define _rep(i,a,b) for(int i = a;i <= b; i++) // 宏定义
int main(){int n;while(scanf("%d",&n) == 1 && n){queue<int> q;_rep(i,1,n) q.push(i);printf("移除的卡片:");bool first = true;while(q.size() >= 2){if(first){first = false;printf(" %d",q.front());}else printf(" ,%d",q.front());// 移除第一个并将移除后的第一个放入最后q.pop();q.push(q.front());q.pop();} printf("\n最后一张卡片: %d",q.front());} return 0;
}
结果显示:
参考:算法竞赛入门经典习题与解答 陈锋 编著