Skip to content

第二、三个点超时,估计是swap太多了吧 #12

@likmin

Description

@likmin

题目地址


#include<iostream>
#include<vector>
using namespace std;
bool isSort(vector<int> v) {
	for (int i = 0; i < v.size() - 1; i++) {
		if (v[i] < v[i + 1])continue;
		else return false;
	}
	return true;
}
int main()
{
	int N, zero;//zero记录0的下标
	cin >> N;
	vector<int> v(N),D(N);
	for (int i = 0; i < N; i++) {
		cin >> v[i];
		D[v[i]]=i;
		if (v[i] == 0)zero = i;
	}
	int min = 0;
	int j = 1;
	while (!isSort(v)) {
		int i;
		if (zero== 0) {//此时v还不是有序序列,但是0的下标为0,所以找下一个最小的没有对号入座的
			while (v[j] == j)
				j++;
			i = D[j];
		}
		else 
			i = D[zero];
		swap(v[zero], v[i]);//交换0和i位置
		swap(D[v[zero]], D[v[i]]);//交换0和i的下标位置
		zero = i;
		min++;
	}
	printf("%d", min);
	return 0;
}


Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions