-
圆桌问题求解
- 题目已略,代码如下
- “G”代表好人,“B”代表坏人。使用容器vector动态实现。
- 编辑器:Xcode Version 13.1
//
// main.cpp
// 圆桌问题
//
// Created by Jkchou on 2022/1/16.
//
#include <iostream>
#include <vector>
using namespace std;
int main()
{
int n, m;
vector<int>table;
while (cin>>n>>m) {
table.clear();
for (int i = 0; i < 2*n; ++i) {
table.push_back(i);
}
int pos = 0;//记录坏人位置
for (int i = 0; i < n; ++i) {//赶人
pos = (pos + m - 1) % table.size();//环形,取余实现
table.erase(table.begin() + pos);//删除pos处的人,table人数减1
}
int j = 0;
for (int i = 0; i < 2*n; ++i) {//输出预先安排好的座位
if(!(i % 50) && i)
cout<<endl;
if(j < table.size() && i == table[j]){//table内的都是好人
j++;
cout<<"G";
}else{
cout<<"B";
}
}
cout<<endl;
}
return 0;
}
2.代码分析
vector插入或者删除某一元素时需要线性时间,即需要将该元素之后所有的元素往后移或者前移,需要O(n)的复杂度,当进行大量数据的操作时,运行效率会很低。代码中table.erase()就存在了该问题。
3.知识拓展
功能 | 例子 | 说明 |
---|---|---|
赋值 | a.push_back(100); | 在尾部添加元素 |
元素个数 | int size = a.size(); | 元素个数 |
是否为空 | bool isEmpty = a.empty(); | 判断是否为空 |
打印 | cout<<a[0]<<endl; | 打印第一个元素 |
中间插入 | a.insert(a.begin() + i, k); | 在第i个元素前面插入k |
尾部插入 | a.push_back(8); | 尾部插入元素值为8的元素 |
删除尾部 | a.pop_back(); | 删除末尾元素 |
删除区间 | a.erase(a.begin()+i, a.begin()+j); | 删除区间[i, j-1]的元素 |
删除元素 | a.erase(a.begin()+2); | 删除第三个元素 |
调整大小 | a.resize(m); | 数组大小变为m |
清空 | a.clear(); | 清空 |
翻转 | reverse(a.begin(), a.end()); | reverse函数翻转vector |
排序 | sort(a.begin(), a.end()); | sort排序vector |
4.备注
- 本文纯用作学习和分享知识,无任何商业用途,参考过部分文章与书籍,侵立删。
- 技术改变世界,阅读塑造人生。好好学习,天天向上。