注意插入或删除中间某一项需要线性时间,即把这个元素后面的所有元素往后移或者往前移。如果频繁移动,则效率很低。注意删除某一项是它后面所有的项(后面所有项看做一个整体)往前移动一位,而不是把删除的这一项变为0。a.clear()只是清空数据,系统为vector分配的内存还在。
做一个题能更好掌握,例题演示:
HDU4841“圆桌问题”
AC代码:
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,m;
vector<int>s;
while(cin>>n>>m)
{
s.clear();
for(int i=0;i<2*n;i++)
s.push_back(i);
int pos=0;
for(int i=0;i<n;i++)
{
pos=(pos+m-1)%s.size();
s.erase(s.begin()+pos);//处死n个坏人。
}
int j=0;
for(int i=0;i<2*n;i++)
{
if(i%50==0&&i) cout<<endl;
if(i==s[j]&&j<s.size())//j<s.size(),防止vector越界。
{
j++;
cout<<"G";
}
else
cout<<"B";
}
cout<<endl<<endl;
}
}