zoukankan      html  css  js  c++  java
  • 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,所以找的时候还需要遍历,,,,

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

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

    为了自己,和那些爱你的人
  • 相关阅读:
    要搜索内容
    .net core 过滤器
    C# => 写法
    js 数组的forEach 函数
    .net core 下载文件 其他格式
    win10 1903 更改文字大小
    fetch 写法
    C# 匿名对象 增加属性
    ping —— 虚拟机
    selenium验证车贷计算器算法
  • 原文地址:https://www.cnblogs.com/zhmlzhml/p/15048227.html
Copyright © 2011-2022 走看看