题目描述
牛牛有一个长度为n的整数序列,牛牛想对这个序列进行重排为一个非严格升序序列。牛牛比较懒惰,他想移动尽量少的数就完成重排,请你帮他计算一下他最少需要移动多少个序列中的元素。(当一个元素不在它原来所在的位置,这个元素就是被移动了的)
输入描述:
输入包括两行,第一行一个整数n(1 ≤ n ≤ 50),即序列的长度 第二行n个整数x[i](1 ≤ x[i] ≤ 100),即序列中的每个数
输出描述:
输出一个整数,即最少需要移动的元素个数
示例1
思路:一开始判断 某元素的位置是否发生改变(加了一个pos属性),WA
后来判断 某个位置的元素值 是否发生改变, AC
AC
#include <iostream> using namespace std; void Swap(int &x,int &y){ int t = x; x = y; y = t; } int main(){ int n; cin>>n; int x[100]; int temp[100]; for(int i=0;i<n;i++){ cin>>x[i]; temp[i] = x[i]; } for(int i=0;i<n;i++){ for(int j=1;j<n-i;j++){ if(x[j-1]>x[j]){ Swap(x[j-1],x[j]); } } } int sum = 0; for(int i=0;i<n;i++){ if(x[i]!=temp[i]){ sum++; } } cout<<sum; return 0; }
WA
#include <iostream> using namespace std; struct Node{ int x; int pos; }node[100]; void Swap(Node &x,Node &y){ struct Node t = x; x = y; y = t; } int main(){ int n; cin>>n; int x[100]; int pos[100]; for(int i=0;i<n;i++){ cin>>node[i].x; node[i].pos = i; } for(int i=0;i<n;i++){ for(int j=1;j<n-i;j++){ if(node[j-1].x>node[j].x){ Swap(node[j-1],node[j]); } } } int sum = 0; for(int i=0;i<n;i++){ if(node[i].pos!=i){ sum++; } } cout<<sum; return 0; }