pat A1067

https://pintia.cn/problem-sets/994805342720868352/problems/994805403651522560

10
3 5 7 2 6 4 9 0 8 1

先看0的位置:与7交换
3 5 0 2 6 4 9 7 8 1

再与2:
3 5 2 0 6 4 9 7 8 1

再与3:
0 5 2 3 6 4 9 7 8 1

现在是0的位置,那就与距离它最近的,不在正确的位置上的进行交换:
5 0 2 3 6 4 9 7 8 1

再重复过程就可以了

可以优化的一个地方是:

这个地方,没有在正确位置的数字而且没有与不在0位置的零交换的肯定是升序的(就是那些0没有占用他们的位子的交换不算)

还是觉得没有表达出来

那就,写一下代码:


#include <algorithm>
#include<iostream>
#include<stdio.h>
#include<string>
#include <vector>
using namespace std;
vector<int> v;
int n;
int k;
int next_no_position(int a){//返回下一个没有排好的
    for (int i = k; i < n; ++i) {
        if(v[i]==i) {
            continue;
        }
        else{
            return i;
        }

    }
    return -1;
}
int swap(int pos){//直接返回0的位置了
    int i;
    for ( i = 0; i < n; ++i) {//主要是这里麻烦了,因为你每次都要遍历
        if(v[i]==pos){
            break;
        }
    }
    v[i]=0;
    v[pos]=pos;
    return i;
}
void print(){
    for (int i = 0; i < n; ++i) {
        cout<<v[i]<<" ";

    }
    cout<<endl;
}

int main(){

    cin>>n;
    int pos=0;
    for (int i = 0; i < n; ++i) {
        int q;
        cin>>q;
        v.push_back(q);
        if(q==0)
            pos=i;
    }
    int num=0;
    int flag=0;

    while(flag!=-1){
        if(pos==0){
            flag=next_no_position(flag);//0 1 3 2-->flag=2 --> 3 1 0 2-->3 1 2 0 --> 0 1 2 3
            k=flag;
            if(flag==-1){
                break;
            }
           cout<<"flag"<<flag<<endl;
            v[0]=v[flag];
            v[flag]=0;

            pos=flag;
           //print();
            num++;


        }
        else{
            pos=swap(pos);
            //print();
            num++;
        }

    }
    cout<<num;




}

结果,TLE了两个测试点...

最后看了一下书上的题解,发现其实我存数据的时候出现了问题,一开始定义的时候,v[i]=j定义成数字i在j这个位置上,swap函数就不用遍历一遍了.我存的时候是第i个位置上是数字j,所以找的时候还需要遍历,,,,

代码就不贴了我才不会说我没写

喔,就刚刚那个代码,还是觉得代码写少了,为啥呢?有一个赋值先更改了它的值才更新的,,数据结构的痛呜呜

posted @ 2021-07-23 15:49  安之若醇  阅读(34)  评论(0编辑  收藏  举报
Live2D服务支持