题目大意:
桌上有N(N<=50)张牌,从第一张开始(最上面的),从上往下依次编号为1~n。当至少还剩下两张牌时进行以下操作:把第一张牌扔掉,然后把新的第一张牌放到正堆牌的最后,输入每行包含一个n,输出每次扔掉的牌以及最后剩下的牌。
样例如下:
Sample Input
7
19
10
6
0
Sample Output
Discarded cards: 1, 3, 5, 7, 4, 2
Remaining card: 6
Discarded cards: 1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 4, 8, 12, 16, 2, 10, 18, 14
Remaining card: 6
Discarded cards: 1, 3, 5, 7, 9, 2, 6, 10, 8
Remaining card: 4
Discarded cards: 1, 3, 5, 2, 6
Remaining card: 4
思路分析:
利用队列的知识,首先把1~N这几个数Push到队列中去,然后模拟题目描述的那样,删除第一个元素,把第二个元素放到牌堆底,直到剩下最后一张牌~~~中间也要注意一些问题,比如输出时不要多逗号,最后一行不要换行!!!!比赛时也要看清题目是否需要输出空格(简直不能再坑!/(ㄒoㄒ)/~~)
源代码:
1 #include<iostream> 2 #include<queue> 3 using namespace std; 4 int main() 5 { 6 7 int n; 8 while (cin >> n) 9 { 10 if (n > 1 && n <= 50) //分情况讨论 11 { 12 queue<int>a; 13 for (int i = 1; i <= n; i++) 14 a.push(i); 15 16 cout << "Discarded cards: "; 17 18 while (a.size() >= 2) //先判断再循环 19 { 20 if (a.size() == 2) 21 { 22 cout << a.front(); 23 a.pop(); 24 break; //处理输出最后一个元素 25 } 26 else 27 { 28 cout << a.front() << ", ";//输出当前第一张牌(即要扔掉的牌) 29 a.pop(); //把第一张牌丢掉 30 a.push(a.front()); //把接下来的一张牌放入牌堆底 31 a.pop(); //把当前的第一张牌扔掉 32 } 33 //n=a.size(); 34 35 36 } 37 38 cout << endl; 39 cout << "Remaining card: " << a.front() << endl; 40 41 } 42 else if (n == 1) 43 { 44 cout << "Discarded cards:" << endl; 45 cout << "Remaining card: " << n << endl; 46 47 } 48 49 else 50 break; //输入0是程序结束 51 } 52 //system("pause"); 53 return 0; 54 }
心得:
开始本来vector写,结果不会~~~~(>_<)~~~~,然后用队列,中途各种问题,写出一道题也是如此坎坷,/(ㄒoㄒ)/~~
中间要先判断再循环,不然在输入1时可能就会出错,然后就是输出格式!!
引入:“要调整好心态啊,不然你会很苦恼的”
“沉下心,慢点来”
好好学吧O(∩_∩)O
还是不够努力啊。。。。
(虽然前面的路是黑暗+坎坷。。。。)
时间: 2024-12-29 11:56:24