在完成CodeForce 234E的时候,想到可以用Vector来完成模拟,下面给出代码
#include<bits/stdc++.h>
using namespace std;
struct Team{
char name[121];
int score;
} team[67];
bool cmp(Team A,Team B) { return A.score>B.score; }
vector<vector<Team> > vec;
vector<Team> vtemp;
int x,a,b,c;
int randm(int x)
{
return (x*a+b)%c;
}
int main()
{
freopen("input.txt","r",stdin);
freopen("output.txt","w",stdout);
int n,m;
cin>>n;
cin>>x>>a>>b>>c;
m=n/4;
memset(team,0,sizeof(team));
for(int i=0;i<n;++i)
cin>>team[i].name>>team[i].score;
sort(team,team+n,cmp);
for(int i=0;i<4;i++)
{
for(int j=0;j<m;j++)
vtemp.push_back(team[i*m+j]);
vec.push_back(vtemp);
vtemp.clear();
}
int temp=randm(x);
for(int k=0;k<=m-1;++k)
{
cout<<"Group "<<(char)('A'+k)<<":"<<endl;
for(int i=0;i<4;++i)
{
cout<<vec[i][temp%vec[i].size()].name<<endl;
//cout<<"i="<<i<<"---"<<temp<<"---"<<vec[i].size()<<endl;
vec[i].erase(vec[i].begin()+temp%vec[i].size());
temp=randm(temp);
}
}
return 0;
}
在完成这道题目的时候,遇到的问题有
- Vector 二维数组的初始化和插入问题
- Vector 二维数组的查找和删除操作
初始化
Vector 二维数组的初始化方式有以下几种
- 直接用初始化方法
vector<vector<int> > newOne(r, vector<int>(c, 0));
- 用resize()来控制大小
vector<vector<int> > res;
res.resize(r);//r行
for (int k = 0; k < r; ++k){
res[k].resize(c);//每行为c列
}
因为后面的插入操作可以完成题目的要求,代码中不再展示
插入
在我的代码里如果使用vec[i].push_back(),在i>0的时候会出现数据在行尾的问题,故在这一题里面我使用了以下方法,如果有大神知道为什么请在评论区指出
for(int i=0;i<4;i++)
{
for(int j=0;j<m;j++) //
vtemp.push_back(team[i*m+j]); // 在内层循环将第i行的内容push_back进vtenp数组中.
vec.push_back(vtemp);//再将vtemp 数组整体push_back进vec数组中
vtemp.clear(); //清空vtemp数组
}
查找
Vector 没有内置find() 方法,故只能使用Algorithm自带的find()方法,具体使用样例如下
vector<int>::iterator it = find(vec.begin(), vec.end(), XXX);//XXX 为所需要查找的内容,使用时需要包含Algorithm头文件
删除
Vector 删除某个元素的方法有三种
- pop_back()
vecInt.pop_back();//删除最后一个元素
- erase()
vector<int>::iterator k = vecInt.begin();
vecInt.erase(k);//删除第一个元素
//vecInt.erase(k); //迭代器k已经失效,会出错
cout<<"删除第一个元素后,vector contains "<<vecInt.size()<<" elements"<<endl;
//vecInt.erase(vecInt.begin(),vecInt.end()); //删除所有元素
注意,eraser()接收的值为迭代器类型,不能直接使用Vector下标来删除元素
3. remmove
vector<int>::iterator vecNewEnd =remove(vecInt.begin(),vecInt.end(),5); //删除元素
remove()方法使用时一般不会改变容器的大小
参考博客:
Vector二维数组的插入:https://ask.csdn.net/questions/246763
Vector二维数组的构造:https://blog.csdn.net/sinat_36053757/article/details/71053706
Vector二维数组的实现:https://blog.csdn.net/a819825294/article/details/52088732
Vector二维数组的find()方法:https://blog.csdn.net/test1280/article/details/65937779
Vector二维数组的删除方法:https://blog.csdn.net/doctor_feng/article/details/11880787