STL初探中的初探

STL初探中的初探

梳理一下几道例题

Uva10474 Where is the Marble

原题地址

。。。

都不想说什么,贴代码

#include<bits/stdc++.h>
using namespace std;
int a[100005];
int n,q;
int cnt=0;
int main()
{
        while(scanf("%d%d",&n,&q)==2 && n!=0 && q!=0)
        {
                cnt++;
                for(int i=1;i<=n;i++)
                {
                        scanf("%d",&a[i]);
                }
                sort(a+1,a+1+n);
                  cout<<"CASE# "<<cnt<<":"<< endl;
                for(int i=1;i<=q;i++)
                {
                        int x;
                        scanf("%d",&x);
                        int pos=lower_bound(a+1,a+1+n,x)-a;
                        if(x==a[pos])
                        {
                                cout << x << " " <<"found" << " "<< "at" << " "<<pos << endl;
                        }
                        else{
                                cout <<x<<" "<<"not"<<" "<<"found"<<  endl;
                        }
                }
        }
        return 0;
}

sort和lower_bound的基本运用

Uva101 The Blocks Problem

原题地址

这道题有搞头,我肝了一个晚上(掩面而泣)

由题意我们发现,当指令中有"onto"时,b会被拿到最上面,而当指令中有move时,a会被拿到嘴上卖面,这可以大大精简代码量,若不精简,会因玄学导致RE,由于这里数组大小不定则使用vector。

#include<bits/stdc++.h>
const int maxn = 30;
using namespace std;
int n;
vector<int> sta[maxn];
 vector<int>::iterator it;
 int pos[maxn];
 void moveall(int num,int p1,int p2)
 {
         for(it=find(sta[p1].begin(),sta[p2].end(),num);it!=sta[p1].end();it++)
         {
                 int x=*it;
                 sta[p2].push_back(x);
                 pos[x]=p2;
         }
        it=find(sta[p1].begin(),sta[p2].end(),num);
        sta[p1].erase(it,sta[p1].end());
 }
 void putdown(int num,int p)
 {
         it=find(sta[p].begin(),sta[p].end(),num);
         int x=*it;
         sta[p].erase(it);
        sta[p].push_back(x);
}
void move_onto(int  a,int b)
{
        int pos1=pos[a];
        int pos2=pos[b];
        if(pos1==pos2) return;
        putdown(a,pos1);
        putdown(b,pos2);
        it=sta[pos1].end()-1;
        int x=*it;
        sta[pos1].pop_back();
        sta[pos2].push_back(x);
        pos[x]=pos2;
}
void move_over(int  a,int b)
{
        int pos1=pos[a];
        int pos2=pos[b];
        if(pos1==pos2) return;
        putdown(a,pos1);
        it=sta[pos1].end()-1;
        int x=*it;
        sta[pos1].pop_back();
        sta[pos2].push_back(x);
        pos[x]=pos2;
}
void pile_onto(int a,int b)
{
        int pos1=pos[a];
        int pos2=pos[b];
        if(pos1==pos2) return;
        putdown(b,pos2);
        moveall(a,pos1,pos2);
}
void pile_over(int a,int b)
{
        int pos1=pos[a];
        int pos2=pos[b];
        if(pos1==pos2) return;
        moveall(a,pos1,pos2);
}
int main()
{
        cin >> n;
        for(int i=0;i<n;i++){
                sta[i].push_back(i);
                pos[i]=i;
        }
        string s1,s2;
        int a,b;
        while(cin >> s1)
        {
                if(s1=="quit") break;
                cin >>  a >> s2 >>b;
                if(s1=="move")
                {
                        if(s2=="onto") move_onto(a,b);
                        else move_over(a,b);
                }
                else if(s1=="pile"){
                        if(s2=="onto")pile_onto(a,b);
                        else pile_over(a,b);
                }
        }
        for(int i=0;i<n;i++)
        {
                printf("%d: ",i);
                for(it=sta[i].begin();it!=sta[i].end();it++)
                {
                        printf("%d ",*it);
                }
                printf("\n");
        }
        return 0;
}

这是之前的代码

#include<bits/stdc++.h>
using namespace std;
int n;
vector<int>sta[30];
int find_p(int x)
{
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<sta[i].size();j++)
        {
            if(sta[i][j]==x) return i;
        }
    }
}
int find_h(int x)
{
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<sta[i].size();j++)
        {
            if(sta[i][j]==x) return j;
        }
    }
}
void onto(int p1,int h,int p2)
{
    for(int i=h;i<sta[p1].size();i++)
    {
        sta[p2].push_back(sta[p1][i]);
    }
    sta[p1].resize(h);
}
void doing(int p,int h)
{
    for(int i=h+1;i<sta[p].size();i++)
    {
        int where = sta[p][i];
        sta[where].push_back(where);
    }
    sta[p].resize(h+1);
}
int main()
{
    cin >> n;
    for(int i=0;i<n;i++)
    {
        sta[i].push_back(i);
    }
    string s1,s2;
    int a,b;
    while(cin >> s1)
    {
        if(s1=="quit") break;
        cin >> a >> s2 >> b;
        int p1=find_p(a);
        int p2=find_p(b);
        int h1=find_h(a);
        int h2=find_h(b);
        if(p1==p2) continue;
        if(s1=="move") doing(p1,h1);
        if(s2=="onto") doing(p2,h2);
        onto(p1,h1,p2);
    }
    for(int i=0;i<n;i++)
    {
        printf("%d:",i);
        for(int j=0;j<sta[i].size();j++)
        {
            printf(" %d",sta[i][j]);
        }
        printf("\n");
    }
    return 0;
}

这是之后的代码

理解了其实很简单

Uva156 Ananagrams

原题地址

这题是map的基本应用,还有,谁重排谁zz,标准化之后再push进map里就行了,代码很简单

#include<bits/stdc++.h>
using namespace std;
map<string,int> cnt;
vector<string> words;
string repr(const string& s)
{
    string ans=s;
    for(int i=0;i< ans.length();i++)
        ans[i]=tolower(ans[i]);
    sort(ans.begin(), ans.end());
    return ans;
}
int main()
{
    int n = 0;
    string s;
    while(cin >> s){
        if(s[0]=='#') break;
        words.push_back(s);
        string r = repr(s);
        if(!cnt.count(r)) cnt[r]=0;
        cnt[r]++;
    }
    vector<string> ans;
    for(int i=0;i<words.size();i++)
        if(cnt[repr(words[i])] == 1) ans.push_back(words[i]);
    sort(ans.begin(),ans.end());
    for(int i=0;i<ans.size();i++)
        cout << ans[i] << "\n";
    return 0;
}

posted @ 2019-07-01 21:39  HaderMimosaAcrux  阅读(153)  评论(0编辑  收藏  举报