USACO 2.1.3 Sorting A Three-Valued Sequence

本博客介绍了一种算法,用于将只包含1、2、3的数列重新排列,使其成为递增序列。通过交换特定位置的元素,实现从原始序列到递增序列的转换。

题意大致是说把一个仅含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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值