USACO 2.1.3 Sorting a Three-Valued Sequence(sort3)
这道题就是给出由123三个值的一个数字序列,然后让你把这个序列升序排序,求最小的交换次数。注意这里可以不是相邻交换。
刚开始一看题的时候,还以为t=a a=b b=t那种水题呢,然后发现不是水题。。
于是就想思路...既然是排序题,就先把他排序好了,然后就再对比一下。
比如说USACO上的样例数据:
排序前 排序后
(1)2 1
(2)2 1
(3)1 2
(4)3 2
(5)3 2
(6)3 3
(7)2 3
(8)3 3
(9)1 3
既然他要求的是最少次数,那么我们就不要移动已经在原位不用移动的数据,所以我们可以把在原位不用移动的数据删掉。这里的6和8是不用移动的数据。删掉后,然后变成了:
(1)2 1
(2)2 1
(3)1 2
(4)3 2
(5)3 2
(7)2 3
(9)1 3
这就出现可以两两交换的位置了,比如说第1号位置和第3号位置可以两两交换。我们把可以两两交换的位置定义为交叉相等。这个数据里面的第1号和第3号是交叉相等,第3号和第7号是交叉相等的,所以把他们两两交换就能回到原位了。两两交换只会交换一次,所以在这一步里面,把答案每交换一次+1,直到没有再能两两交换的位置了。然后就变成了:
(2)2 1
(5)3 2
(9)1 3
我们发现这里就剩下三组了,其实每一组数据筛选之后都会变成3的倍数组。想一想为什么。因为他这里面一共会出现3种数据(1,2,3),而会出现第一次筛选出现的在原位的情况,第二次筛选出现的互相换的情况,这次该出现三数据交换的情况了。为什么不会出现四个数据交换?因为他只有三个数据,你第四个数据哪里蹦出来的。。。既然剩下的都是三个数据交换,那么就不用再次寻找了,可以用剩余数据总数直接计算了。因为每一对三数据换会换两次(自己试试就知道了),所以这一次需要交换的次数为(剩余组数/3*2)。
既然思路理清了,就上代码把。。
解释一下,a是输入的数组,b是排序后的数组,c是是否被排除,没排除就是0,被排除就是1。
n是输入的数据总数,m是剩余的数据总数(会不断减少)。ans就是答案,就是交换的总次数。
/*
ID:aaabbbr1
LANG:C++
TASK:sort3
*/
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
int a[1002];
int b[1002];
bool c[1002];
int main()
{
freopen("sort3.in","r",stdin);
freopen("sort3.out","w",stdout);
int n,m;
scanf("%d",&n);
m=n;//刚开始的时候,剩余数据数等于数据总数
int ans=0;//答案要是0
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
b[i]=a[i];//b数组是用来排序的
}
sort(b+1,b+1+n);//排序b数组
memset(c,0,sizeof(c));//c数组是用来标识是否被排除的
for(int i=1;i<=n;i++)//枚举一个换的情况
{
if(a[i]==b[i])//如果数据在原位
{
m--;//剩余数据数-1
c[i]=1;//排除数据
}
}
for(int i=1;i<=n;i++)
for(int j=1;j<i;j++)//穷举两个互换的情况
{
if(a[i]==b[j]&&a[j]==b[i]&&c[i]!=1&&c[j]!=1)//意思是如果符合交叉相等并且两个都未被排除
{
m-=2;//数据剩余数减去2
ans+=1;//答案+1,需要交换一次
swap(a[i],a[j]);//这句好像没必要
c[i]=1;//排除,否则出错
c[j]=1;//同上
}
}
ans+=m/3*2;//这是3个换的情况
printf("%d\n",ans);
fclose(stdin);
fclose(stdout);
return 0;
}
USACO 2.1.3 Sorting a Three-Valued Sequence(sort3)的更多相关文章
- bzoj usaco 金组水题题解(1)
UPD:我真不是想骗访问量TAT..一开始没注意总长度写着写着网页崩了王仓(其实中午的时候就时常开始卡了= =)....损失了2h(幸好长一点的都单独开了一篇)....吓得赶紧分成两坨....TAT. ...
- USACO翻译:USACO 2012 JAN三题(2)
USACO 2012 JAN(题目二) 一.题目概览 中文题目名称 叠干草 分干草 奶牛联盟 英文题目名称 stacking baleshare cowrun 可执行文件名 stacking bale ...
- USACO翻译:USACO 2014 JAN三题(1)
USACO 2014 JAN 一.题目概览 中文题目名称 滑雪场设计 滑雪降速 滑雪场评级 英文题目名称 skidesign slowdown skilevel 可执行文件名 skidesign sl ...
- [USACO精选] 第二章 动态规划(一)
#4 公司利润 2014-01-16 这真的是动归?怎么觉得有点贪心的心态在.时间复杂度O(N),空间复杂度O(1),轻松加愉快!唯一要注意的是ANS一开始要赋负值,因为最终答案可能是负的. ; va ...
- [大牛翻译系列]Hadoop(6)MapReduce 排序:总排序(Total order sorting)
4.2.2 总排序(Total order sorting) 有的时候需要将作业的的所有输出进行总排序,使各个输出之间的结果是有序的.有以下实例: 如果要得到某个网站中最受欢迎的网址(URL),就需要 ...
- Codeforces 606-C:Sorting Railway Cars(LIS)
C. Sorting Railway Cars time limit per test 2 seconds memory limit per test 256 megabytes input stan ...
- USACO 2.1 海明码 Hamming Codes (模拟+位运算+黑科技__builtin_popcount(n))
题目描述 给出 N,B 和 D,要求找出 N 个由0或1组成的编码(1 <= N <= 64),每个编码有 B 位(1 <= B <= 8),使得两两编码之间至少有 D 个单位 ...
- 【USACO 2.1】Sorting A Three-Valued Sequence
/* TASK: sort3 LANG: C++ URL: http://train.usaco.org/usacoprob2?a=RkPIMxsFWzm&S=sort3 SOLVE: n个数 ...
- USACO Section 2.1 Sorting a Three-Valued Sequence
/* ID: lucien23 PROG: sort3 LANG: C++ */ #include <iostream> #include <fstream> #include ...
随机推荐
- 数据库学习笔记 (三) python操作数据库
python 操作MYSQL数据库主要有两种方式: 使用原生模块:pymysql ORM框架:SQLAchemy 一.pymysql 1.1下载安装模块 第一种:cmd下:执行命令下载安装:pip3 ...
- Python数据库(三)-使用sqlalchemy创建表
首先需要安装sqlalchemy根据所需情况调用数据库接口,对数据库进行操作pymysql:mysql+pymysql://<username>:<password>@< ...
- 数组可以直接转换为DataRow
string[] cc=new string[3]{...}; Dt.Rows.Add(cc);
- 包学会之浅入浅出Vue.js:开学篇
2016年,乃至接下来整个2017年,如果你要问前端技术框架什么最火,那无疑就是前端三巨头:React.Angular.Vue.没错,什么jQuery,seaJs,gulp等都逐渐脱离了热点.面试的时 ...
- HADOOP HDFS BALANCER介绍及经验总结(转)
1.集群执行balancer命令,依旧不平衡的原因是什么?该如何解决? 2.尽量不在NameNode上执行start-balancer.sh的原因是什么? 集群平衡介绍 Hadoop的HDFS集群非常 ...
- Tornado之抽屉实战(2)--数据库表设计
经过我们上次分析,数据库要有最基本的四张表,用户表,消息表,类型表,点赞表,评论表,接下来我们看着怎么设计吧 首先我们要清楚,表设计的代码是写在models下的 用户表 ? 1 2 3 4 5 6 7 ...
- JAVA反射机制学习随笔
JAVA反射机制是用于在运行时动态的获取类的信息或者方法,属性,也可以用来动态的生成类,由于所有类都是CLASS的子类,我们可以用一个CLASS类的实例来实例化各种类 例如: Class<?&g ...
- 解决ftp无法连接登录linux的办法
1. 首先安装vsftpd 命令:yum -y install vsftpd 之后开启服务:service vsftpd start 2.关闭防火墙 1) 重启后生效 开启: chkconfig ip ...
- [转] php foreach用法和实例
PHP 4 引入了 foreach 结构,和 Perl 以及其他语言很像.这只是一种遍历数组简便方法.foreach 仅能用于数组,当试图将其用于其它数据类型或者一个未初始化的变量时会产生错误.有两种 ...
- C++面向对象类的实例题目十一
题目描述: 写一个程序计算三角形,正方形和圆形3种图形的面积 程序代码: #include<iostream> #include<cmath> #define PAI 3.14 ...