17行代码AC——习题5-3 卡片游戏(Throwing cards away I, UVa 10935,约瑟夫环)_解题报告

励志用少的代码做高效的表达


题目(提交)链接→UVa-10935


本题为水题,因此侧重点由解题转向优化。

解题思路:

解法一思路:用vector动态数组存储,可以方便的实现插入、删除等操作。
解法二思路:用数组存储,模拟插入、删除等操作。
后知后觉:此题本质是模拟队列输出(因为操作都在头部),STL_queue容器解题最佳。 当然,用vector效率相同。


注意:

1、n=1时 Discarded cards:也是输出的,冒号后没空格。(还是挺坑的。)
2、涉及到删除操作最好用数组模拟删除,不要用容器,因为容器删除涉及到迭代器,很麻烦,本题中只用到了头部删除,因此也可以考虑使用vector的删除操作解题。


解法一代码:

#include
using namespace std;
int main() {
	int n; 
	while((cin >> n) && n) {
		vector<int>v;														//声明a数组,赋0 		
		for(int i = 1; i <= n; i++) v.push_back(i);							//a数组赋值 
		cout << "Discarded cards:";
		while(v.size() >= 2) {
			(v.size()==2) ? cout<<' '<<v[0] : cout<<' '<<v[0]<<",";			//若序列长=2则不输出逗号 
			v.erase(v.begin());												//删除v[0] 
			v.push_back(v[0]); v.erase(v.begin());							//v[1]放到序列后 
		}
		cout << endl <<  "Remaining card: " << v[0] << endl; 
	}
	return 0;
}

解法二代码:

(PS:五个月后二刷,只用了数组就解出来了,这两种方法效率都挺高的,用什么就仁者见仁智者见智了。)

#include
int n, a[110];
using namespace std;
int main() {
	while(cin>>n && n) {
		for(int i = 1; i <= n; i++) a[i] = i;
		int left = n; left--; 	//需要执行n-1步
		int p1 = 1; 			//从1开始 
		cout << "Discarded cards:";	//注意这里冒号后没有空格 
		while(left) {			//执行n-1步 
			left--;				
			cout << ' ' << a[p1] << (left?",":"");
			a[n+1] = a[p1+1]; 	//把后一位挪到最后 
			p1+=2; n+=1;		//更新p1和数组长度n 
		}
		cout << endl << "Remaining card: " << a[p1] << endl; 
	}
return 0;}

拨云见日,未来可期。
17行代码AC——习题5-3 卡片游戏(Throwing cards away I, UVa 10935,约瑟夫环)_解题报告_第1张图片

你可能感兴趣的:(算法竞赛与入门经典,c++,C++与STL入门)