c++stl之动态数组(vector)

一、用法总结

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;
}

猜你喜欢

转载自blog.csdn.net/zhoucheng_123/article/details/104393676