e155 - 10935 - Throwing cards away I
題目描述
題目描述了移除卡牌的過程。給定一個包含 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];
}
}