题意大致是说把一个仅含1,2,3的数列排成不减序。先确定有多少个1,多少个2,多少个3。
然后把处于原属于2的位置的1和处于原属于1位置的2互换。
接下来对(1,3)、(2,3)照样操作。
在对(1,2)、(1,3)操作时,如果1不够,可以用另一数替代(如23231333,1处于原属3的位置,只能将1和3互换)
/*
ID:szwjcch971
LANG:C++
TASK:sort3
*/
#include "stdio.h"
int main(){
int count1,count2,count3,i,j,k,n,flag,temp,ans=0;
int num[1002];
FILE *fin=fopen("sort3.in","r");
FILE *fout=fopen("sort3.out","w");
fscanf(fin,"%d",&n);
for(i=1;i<=n;i++)fscanf(fin,"%d",&num[i]);
count1=count2=count3=0;
for(i=1;i<=n;i++){
switch(num[i]){
case 1:count1++;break;
case 2:count2++;break;
case 3:count3++;break;
default:break;
}
}
for(i=1;i<=count1;i++){
if(num[i]==2){
flag=1;
for(j=count1+1;j<=count1+count2;j++){
if(num[j]==1){
temp=num[i];num[i]=num[j];num[j]=temp;
ans++;
flag=0;break;
}
}
if(flag){
for(j=count1+count2+1;j<=n;j++){
if(num[j]==1){
temp=num[i];num[i]=num[j];num[j]=temp;
ans++;
break;
}
}
}
}
if(num[i]==3){
flag=1;
for(j=count1+count2+1;j<=n;j++){
if(num[j]==1){
temp=num[i];num[i]=num[j];num[j]=temp;
ans++;
flag=0;break;
}
}
if(flag){
for(j=count1+1;j<=count1+count2;j++){
if(num[j]==1){
temp=num[i];num[i]=num[j];num[j]=temp;
ans++;
break;
}
}
}
}
}
for(i=count1+1;i<=count1+count2;i++){
if(num[i]==3){
for(j=count1+count2+1;j<=n;j++){
if(num[j]=2){
temp=num[i];num[i]=num[j];num[j]=temp;
ans++;
break;
}
}
}
}
fprintf(fout,"%d\n",ans);
return 0;
}
本博客介绍了一种算法,用于将只包含1、2、3的数列重新排列,使其成为递增序列。通过交换特定位置的元素,实现从原始序列到递增序列的转换。

479

被折叠的 条评论
为什么被折叠?



