Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

贴题意及代码

Posted by afeel at 2017-07-22 10:46:37 on Problem 3629
/*	题意:
	Bessie跟朋友玩牌,总共n人k张牌,k是n的整数倍。k张牌中共有k/n张好牌,Bessie想要作弊得到所有好牌。
	可Bessie的同伴为了防止Bessie作弊而设定了如下规则:

	1.每次发牌从牌顶发,从Bessie右手边第一个人开始。

	2.每发出一张牌就要将接下来的p张牌依次放至牌底。

	按照这个方法发完所有牌。即使是这样,Bessie依然想要拿到所有好牌,请你帮她计算出将好牌放在哪些位置可以实现Bessie的愿望。
*/

// 有 N 个人, 主角最后发牌,每发一次牌就从牌顶移动 P 张牌到牌尾 
// 记录发给主角的牌的位置,因为主角要的是好牌,记录的位置即为好牌  
// 好牌全部发完或者全部牌发完就结束游戏,目的是贝西拿到全部好牌即可 

#include<cstdio>	
#include<algorithm>	
#include<cmath>	
#include<queue>
#define Max 50005							

using namespace std;

queue<int> l;
int N, K, P, n[Max], o = -1;					

void create() {
	while(!l.empty())				//清空队列 
		l.pop();
	for(int i = 1; i<= K; i++)		//依次存入 
		l.push(i);
}

void solve() {
	int good = 0;
	while( !l.empty() ) {			//队内非空则取牌 
		int i = N;
		while(i--) {
			if(i == 0) {			//轮到主人公取牌 
				n[++o] = l.front();	//存入好牌位置 
				l.pop();					
				good++;
				if(good == K/N		//若好牌已经取完则退出 
					return;
			}	
			else 
				l.pop();
			int b = P;			//每发一张牌则移动牌顶 P 
			while(b--) {			//张牌到牌尾,即先出队再入队 
				int c = l.front();
				l.pop();
				l.push(c);
			}
		}
	}
}

void show() {						//快排后再打印结果 
	sort(n, n+o+1);
	for(int i = 0; i<= o; i++)
		printf("%d\n", n[i]);
}

int main() {
	scanf("%d %d %d", &N, &K, &P);
	create();
	solve();
	show();

	return 0;
}

Followed by:

Post your reply here:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator