(luogu题解搬运系列)luogu p1459 三值的排序

题目描述

排序是一种很频繁的计算任务。现在考虑最多只有三值的排序问题。一个实际的例子是,当我们给某项竞赛的优胜者按金银铜牌排序的时候。在这个任务中可能的值只有三种1,2和3。我们用交换的方法把他排成升序的。

写一个程序计算出,给定的一个1,2,3组成的数字序列,排成升序所需的最少交换次数

输入输出格式

输入格式:

 

第一行:

奖牌个数N (1 <= N <= 1000)

第 2行到第N+1行:

每行一个数字,表示奖牌。共N行。(1..3)

 


输出格式:

 

共一行,一个数字。表示排成升序所需的最少交换次数。

 

输入输出样例

输入样例#1:

9
2
2
1
3
3
3
2
3
1

输出样例#1:

4

说明

USACO 2.1

翻译来自NOCOW

首先统计出每个数字都有多少个,之后找出错位的数的个数,用最少的步数将其交换过来即可。

以样例为例:

2 2 1 3 3 3 2 3 1

其中1有2个,2有3个,3有4个。正确的序列应为:

1 1 2 2 2 3 3 3 3

可见,原本是1的位置,有2个2,记为e[1][2]=2;

原本是2的位置,有1个1和2个3 记为e[2][1]=1;e[2][3]=2;

原本是3的位置,有1个1和1个2。记为e[3][1]=1;e[3][2]=2;

接下来,如果e[i][j]>0&&e[j][i]>0

sum+=min(e[i][j],e[j][i]);

不过样例中,e[1][2]>e[2][1],也就是仍有错位存在,这怎么办?

来看下面这一组例子:

2 3 1

三个数字都不在自己该在的位置,但是只需要两步就能变得有序:

2 1 3

1 2 3

剩下的数字一定都是这样的情况,所以统计一下错位数,也一定是三的倍数,对于每三个错位,我们只需两次便能解决。

#include<cstdio>

int a[4],e[4][4],i,n,s,sum,j,x[1001];
int main()
{
  scanf("%d",&n);
  for(i=1;i<=n;i++)
  {
    scanf("%d",&x[i]);
    a[x[i]]++;
  }
  for(i=1;i<=a[1];i++)
  {
    if(x[i]!=1)
    {
      e[1][x[i]]++;
      s++;
    }
  }
  for(i=a[1]+1;i<=a[1]+a[2];i++)
  {
    if(x[i]!=2)
    {
      e[2][x[i]]++;
      s++;
    }
  }
  for(i=a[1]+a[2]+1;i<=a[1]+a[2]+a[3];i++)
  {
    if(x[i]!=3)
    {
      e[3][x[i]]++;
      s++;
    }
  }
  if(e[1][2]<e[2][1]) sum+=e[1][2];
  else sum+=e[2][1];
  if(e[1][3]<e[3][1]) sum+=e[1][3];
  else sum+=e[3][1];
  if(e[3][2]<e[2][3]) sum+=e[3][2];
  else sum+=e[2][3];
  sum+=((s-2*sum)/3)*2;
  printf("%d",sum);
  return 0;
}

时间: 2024-10-29 10:47:30

(luogu题解搬运系列)luogu p1459 三值的排序的相关文章

(luogu题解搬运系列)luogu p2651 添加括号Ⅲ

题目描述 现在给出一个表达式,形如a1/a2/a3/.../an 如果直接计算,就是一个个除过去,比如1/2/1/4=1/8. 然而小A看到一个分数感觉很不舒服,希望通过添加一些括号使其变成一个整数.一种可行的办法是(1/2)/(1/4)=2. 现在给出这个表达式,求问是否可以通过添加一些括号改变运算顺序使其成为一个整数. 输入输出格式 输入格式:   一个测试点中会有多个表达式. 第一行t,表示表达式数量. 对于每个表达式,第一行是n,第二行n个数,第i个数表示ai.   输出格式:   输出

2.1.3 Sorting a Three-Valued Sequence 三值的排序

2.1.3 Sorting a Three-Valued Sequence 三值的排序 一.题目描述 排序是一种很频繁的计算任务.现在考虑最多只有三值的排序问题.一个实际的例子是,当我们给某项竞赛的优胜者按金银铜牌序的时候. 在这个任务中可能的值只有三种1,2 和3.我们用交换的方法把他排成升序的. 写一个程序计算出,给定的一个1,2,3 组成的数字序列,排成升序所需的最少交换次数. PROGRAM NAME: sort3 INPUT FORMAT Line 1: N (1 <= N <= 1

【LuoGu题解】 P1362 【兔子数】

依题意模拟暴力打表找规律,注意到:符合题意的数中只包含\(0,1,2,3\),大于\(3\)的数,平方后都会进位,进位导致\(S(x)*S(x)<S(x*x)\) 观察数据范围,最大满足题意的数字有\(10\)位,那么我们枚举每一位上的数字,然后暴力判断是否为兔子数就行了. Code: #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #inclu

Spring Boot干货系列:(三)启动原理解析

Spring Boot干货系列:(三)启动原理解析 2017-03-13 嘟嘟MD 嘟爷java超神学堂 前言 前面几章我们见识了SpringBoot为我们做的自动配置,确实方便快捷,但是对于新手来说,如果不大懂SpringBoot内部启动原理,以后难免会吃亏.所以这次博主就跟你们一起一步步揭开SpringBoot的神秘面纱,让它不在神秘. 正文 我们开发任何一个Spring Boot项目,都会用到如下的启动类 从上面代码可以看出,Annotation定义(@SpringBootApplicat

[转]C#进阶系列——WebApi 接口返回值不困惑:返回值类型详解

本文转自:http://www.cnblogs.com/landeanfen/p/5501487.html 阅读目录 一.void无返回值 二.IHttpActionResult 1.Json(T content) 2.Ok(). Ok(T content) 3.NotFound() 4.其他 5.自定义IHttpActionResult接口的实现 三.HttpResponseMessage 四.自定义类型 五.总结 正文 前言:已经有一个月没写点什么了,感觉心里空落落的.今天再来篇干货,想要学

OAF_OAF控件系列 - Key Flexfield键值弹性域的实现(案例)

2014-06-17 BaoXinjian 一.摘要 OAF的弹性域的实现基本和Form的弹性域实现的大体思路是一致的,在注册Table和弹性域完全一样,之后通过控件去实现具体的弹性域显示 Form的弹性域初始化基本都在trigger when-new-form-instance中 OAF的弹性域初始化基本都在processRequest中,或者在processRequest调用AM中的初始化方法 1. 网上的一个例子 新建一个EO,其中需要有相关的CCID字段.这里,如果在EO的Dynamic

Nginx系列教程(三)| 一文带你读懂 Nginx 的负载均衡

作者:JackTian 微信公众号:杰哥的IT之旅(ID:Jake_Internet) LAMP 系列导读 01. LAMP 系列教程(一)| 详解 Linux 环境下部署 HTTPD 服务 02. LAMP 系列教程(二)| 如何在 Linux 环境下部署 AWStats 分析系统来监控 Web 站点? 03. LAMP 系列教程(三)| 一文读懂 HTTPD 服务的访问控制 04. LAMP 系列教程(四)| MySQL 数据库系统(一) 05. LAMP 系列教程(五)| MySQL 数据

数组的三值合一

在学习的过程中,发现发现了 一个有趣的东西,那就是数组的三值合一,不知道大家听过没有,我是第一次听,原来也没有注意到这个问题,学习过后,今天总结一下,以下就是我的一些见解. 首先来看下边的代码 测试代码一 #include<iostream> using namespace std; void  main() { int a; int arry[10] = {0}; cout<<arry<<endl; cout<<&arry<<endl;

Maven提高篇系列之(三)——使用自己Repository(Nexus)

这是一个Maven提高篇的系列,包含有以下文章: Maven提高篇系列之(一)——多模块 vs 继承 Maven提高篇系列之(二)——配置Plugin到某个Phase(以Selenium集成测试为例) Maven提高篇系列之(三)——使用自己Repository(Nexus) Maven提高篇系列之(四)——使用Profile Maven提高篇系列之(五)——处理依赖冲突 Maven提高篇系列之(六)——编写自己的Plugin(本系列完) 平时我们自己做的项目都是直接使用Maven提供的Cent