UVA101积木模拟问题,vector整体擦除和整体插入的使用

63 篇文章 0 订阅
52 篇文章 0 订阅

这题先是WA了三发,然后感觉不科学,看了下题解,原来自己把题意完全理解错了,

重新改了下,然后莫名其妙RE一发,然后T了三发,早晨醒来去掉几个if语句竟然过了

3000ms超时瞬间变成了3ms,但是我感觉就去掉了几个if语句而已对于总的时间复杂度应该没有

影响的,队友告诉我去掉几个if语句相当于很大的剪枝,弱渣表示刚刚知道。

看了别人的题解,感觉自己的vector代码比别人简单,思路比别人清晰,而且好理解。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<string>
#include<cctype>
#include<cmath>
#include<map>
#include<set>
#include<vector>
#include<queue>
#include<stack>
#include<ctime>
#define LL __int64
using namespace std;
vector<int> v[29];
int main()
{
    int n;
    while(cin>>n)
    {
        string s;
        for(int i=0;i<n;i++)
        {
            v[i].clear();
            v[i].push_back(i);
        }
        while(cin>>s&&s!="quit")
        {
            int a,b;
            string s1;
            cin>>a>>s1>>b;
          // cout<<s<<' '<<a<<' '<<s1<<' '<<b<<endl;
            if(a==b)
            continue;
            int ax=0,bx=0,ay=0,by=0;
            for(int i=0;i<n;i++)
            {
                for(int j=0;j<(int)v[i].size();j++)
                {
                    if(v[i][j]==a)
                    {
                        ax=i;
                        ay=j;
                    }
                    else if(v[i][j]==b)
                    {
                        bx=i;
                        by=j;
                    }
                }
            }
          //  cout<<ax<<' '<<ay<<' '<<bx<<' '<<by<<endl;
            if(ax==bx)
            {
               // cout<<"sb"<<endl;
                continue;
            }
            if(s[0]=='m')
            {
                for(int i=ay+1;i<(int)v[ax].size();i++)
                {
                    int vv=v[ax][i];
                    v[vv].insert(v[vv].begin(),vv);
                }
                v[ax].erase(v[ax].begin()+ay+1,v[ax].end());
            }
            if(s1[1]=='n')
            {
                for(int i=by+1;i<(int)v[bx].size();i++)
                {
                    int vv=v[bx][i];
                    v[vv].insert(v[vv].begin(),vv);
                }
                v[bx].erase(v[bx].begin()+by+1,v[bx].end());
            }
            v[bx].insert(v[bx].end(),v[ax].begin()+ay,v[ax].end());
            v[ax].erase(v[ax].begin()+ay,v[ax].end());
        }
        for(int i=0;i<n;i++)
        {
            cout<<i<<':';
            for(int j=0;j<(int)v[i].size();j++)
                cout<<' '<<v[i][j];
            cout<<endl;
        }
    }
    /*vector<int> a;
    a.push_back(1);
    a.push_back(2);
    vector<int> b;
    b.push_back(5);
    b.push_back(6);
    a.insert(a.begin(),b.begin(),b.end());
    a.erase(a.begin());
    for(int i=0;i<a.size();i++)
        cout<<a[i];*/
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值