# Simulation# Array# Circular Queue

e155 - 10935 - Throwing cards away I

🔗 前往 ZeroJudge 原題

題目描述

題目描述了移除卡牌的過程。給定一個包含 1 到 n 的卡牌序列,每次移除最上面的卡牌,然後將新的最上面的卡牌移動到牌堆的底部。目標是輸出移除卡牌的順序以及最後剩餘的卡牌。

解題思路

這題可以使用模擬的方法來解決。我們可以使用一個布林陣列 b 來標記卡牌是否被移除。然後,我們按照題目的規則模擬移除卡牌的過程,直到只剩下一張卡牌。在模擬過程中,我們將移除的卡牌的編號記錄下來,最後輸出移除的卡牌序列和剩餘的卡牌。由於卡牌的編號是從 1 開始的,因此我們需要使用索引為 1 的陣列元素。

複雜度分析

  • 時間複雜度: O(n^2)
  • 空間複雜度: O(n)

程式碼

#include <iostream>
#include <string>
using namespace std;
string ans[51];
int main(){
	cin.tie(0); ios::sync_with_stdio(false);
	for(int i=1;i<51;i++){
		ans[i]+="Discarded cards:";
		bool b[i],c=1;
		for(int j=0;j<=i;j++){
			b[j]=0;
		}
		int k=1,n=1;
		while(k<i){
			if(c==1&&b[n]==0){
				b[n]=1;
				c=0;
				ans[i]+=' ';
				int num=n;
				if(num>=10){
					ans[i]+=num/10+48;
					num%=10;
				}
				ans[i]+=num+48;
				if(k!=i-1)
				ans[i]+=',';
				k++;
			}
			else if(c==0&&b[n]==0){
				c=1;
			}
			n++;
			if(n>i){
				n-=i;
			}
		}
		for(int j=1;j<=i;j++){
			if(b[j]==0){
				ans[i]+='\n';
				ans[i]+="Remaining card: ";
				if(j>=10){
					ans[i]+=j/10+48;
					j%=10;
				}
				ans[i]+=j+48;
				ans[i]+='\n';
				break;
			}
		}
	}
	int n;
	while(cin >> n){
		cout << ans[n];
	}
}

Discussion