USACO Section 2.1 Sorting A Three_Valued Sequence - 应该有更好的方法

本文探讨了一种算法,用于计算将特定数值序列中不同元素按照特定规则重新排列所需的最少交换次数。通过统计各元素数量,算法首先将较小元素放置在合适位置,然后优化较大元素的排列,最终计算完成排序所需的交换次数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目的意思是有一列数只由1,2,3组成~~~需要咱们将1放在一起排在最前面~~~2放在一起排在中间~~~3放在一起放后面~~问对于这个数列最少要进行多少次交换...

我的方法是先统计1,2,3的个数~~那么就可以知道1,2,3分辨该放在哪个区域~~

首先将1都放到该放的位置~~其所需步数就是找2~3的区域中1的个数~~然后再看1这个区域里有多少个2可以直接和2区域的交换~~有多少个3可以直接和3区域的交换~~~做完后这是1已经放好了~~而且1中的2都尽量的往2区域放~~1中的3也在尽量的往3区域放~~那么这是2,3区域里面已经没有1了~~~并且显然的是2区域里的3=3区域里的2~~所以任意统计一个区域~~就找到2,3区域相互需要交换的次数了~~两次之和既是答案~~

冥冥之中感觉没必要用这种可以说是纯模拟的方法~~~想推一个更快捷的~~可一直错误~~


Program:

/* ID: zzyzzy12 LANG: C++ TASK: sort3 */ #include<iostream> #include<stdio.h> #include<string.h> #include<math.h> #include<algorithm> #include<queue> using namespace std; int a[1002],g[4],i,ans,n,j; int main() { freopen("sort3.in","r",stdin); freopen("sort3.out","w",stdout); scanf("%d",&n); memset(g,0,sizeof(g)); for (i=1;i<=n;i++) { scanf("%d",&a[i]); g[a[i]]++; } for (i=1;i<=3;i++) g[i]+=g[i-1]; ans=0; for (i=1;i<=g[1];i++) if (a[i]!=1) { ans++; if (a[i]==2) { for (j=g[1]+1;j<=g[2];j++) if (a[j]==1) { a[j]=2; goto A;} for (j=g[2]+1;j<=n;j++) if (a[j]==1) { a[j]=2; goto A; } }else { for (j=g[2]+1;j<=n;j++) if (a[j]==1) { a[j]=3; goto A;} for (j=g[1]+1;j<=g[2];j++) if (a[j]==1) { a[j]=3; goto A; } } A: ; } for (i=g[2]+1;i<=n;i++) if (a[i]==2) ans++; printf("%d\n",ans); return 0; }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值