一、用法总结
1.放入容器尾部vis.push_back(x)
2.元素个数vis.size()
3.删除元素vis.erase(vis.begin()+1)
,表示删除第二个元素,删除的是迭代器
4.检查容器是否为空vis.empty()
5.返回容器尾部的元素vis.back()
6.清空容器vis.clear()
7.插入元素vis.insert(vis.begin(),2);
,表示在vis【0】插入2
8.删除尾部元素vis.pop_back()
,删除尾部元素
9.排序sort(vis.begin(),vis.end())
,遵循左闭右开,即vis.end()不排序
关于时间复杂度:
erase和insert都是O(n)
二、题目总结
nefu 1675 中间数
题目比较水
#include <bits/stdc++.h>
using namespace std;
vector<int>vis;
int main()
{
int x;
while(cin>>x&&x)
{
vis.push_back(x);
}
if(vis.size()%2==1)cout<<vis[(vis.size()-1)/2]<<endl;
else cout<<(vis[vis.size()/2-1]+vis[vis.size()/2])<<endl;
return 0;
}
nefu 2128 锯齿矩阵
#include <bits/stdc++.h>
using namespace std;
int main()
{
int x,n,m,y;
ios::sync_with_stdio(false);
while(cin>>n>>m)
{
vector<int>vis[n+1];
for(int i=0;i<m;i++)
{
cin>>x>>y;
vis[x].push_back(y);
}
for(int i=1;i<=n;i++)
{
for(int j=0;j<vis[i].size();j++)
{
if(j!=0)printf(" %d",vis[i][j]);
else printf("%d",vis[i][j]);
}
printf("\n");
}
}
return 0;
}
nefu 2129 小明堆积木
#include <bits/stdc++.h>
using namespace std;
int main()
{
int x,n,m,y,a,b;
ios::sync_with_stdio(false);
while(cin>>n>>m)
{
vector<int>vis[n+1];
for(int i=1;i<=n;i++)
{
vis[i].push_back(i);
}
for(int i=0;i<m;i++)
{
cin>>a>>b;
if(a==b)continue;
while(!vis[b].empty())
{
vis[a].push_back(vis[b].front());
vis[b].erase(vis[b].begin());
}
}
for(int i=1;i<=n;i++)
{
if(vis[i].empty())printf("-1\n");
else
{
for(int j=0;j<vis[i].size();j++)
{
if(j!=0)printf(" %d",vis[i][j]);
else printf("%d",vis[i][j]);
}
printf("\n");
}
}
}
return 0;
}
nefu 2127 圆桌问题
#include<bits/stdc++.h>
using namespace std;
vector<int>ve;
bool a[20005];
string s1,s2;
int main()
{
int n,m;
while(~scanf("%d %d",&n,&m))
{
ve.clear();
int ans=0;
for(int i=1;i<=2*n;i++)ve.push_back(i);
while(ve.size()>n)
{
ans+=(m-1);
if(ans>=ve.size())ans%=ve.size();
ve.erase(ve.begin()+ans);
}
ans=0;
for(int i=1;i<=2*n;i++)
{
if(ve[ans]==i){printf("G");ans++;}
else printf("B");
}
printf("\n");
}
return 0;
}
nefu 2124 钻石收集者
这题貌似与vector没什么关系
#include<bits/stdc++.h>
using namespace std;
int a[1100005];
int main()
{
int n,k,x;
cin>>n>>k;
for(int i=0;i<n;i++)//装入桶中
{
scanf("%d",&x);
a[x]++;
}
int ant=0;
for(int i=0;i<=1100000;i++)//现在a[i]为a[0]到a[i]的总的钻石数,这里求到11e5,防止下面a[i+k]数组越界
{
if(a[i]){ant+=a[i];a[i]=ant;}
else a[i]=ant;
}
int m;
int maxm=a[k];//因为数组到不了-1,所以先把a[0]到a[k]的钻石数存起来
for(int i=1;i<=1000000;i++)
{
m=a[i+k]-a[i-1];//求a[i]到a[i+k]内的钻石数
if(maxm<m)maxm=m;//保留最大的数
}
cout<<maxm<<endl;
return 0;
}