题目

题目描述

给N个整数,每个整数只能是1,2,或3。现在需要对这个整数序列进行从小到大排序,问最少需要进行几次交换。N(1 <= N <= 1000)

样例输入

9
2
2
1
3
3
3
2
3
1

样例输出

4

解题思路

这个题目我没有做出来,想到一个思路,提交之后返回一个wa。后来看了一下题解,才知道自己错在什么地方。现在来回顾一下。

错误思路

我首先统计了1,2,3的个数,记为cnt1,cnt2,cnt3。然后统计在前cnt1个位置有多少个数字不是等于1的,统计在中间cnt2个位置有多少不是等于2的,统计在后面cnt3个位置有多少不是等于3的,这些统计结果分别记为tot1,tot2,tot3。然后经过一系列的神操作,我得到一个结论:tot = tot1+tot2+tot3,当tot为偶数的时候结果就是tot/2,当tot为奇数的时候结果就应该是(tot-3)/2 + 2。提交结果发现第七组样例过不了。后来想了一小会,没有找到推翻这个结论的样例,就开始找题解了。后来我根据这个思路的漏洞找到了一组样例223311,按照这个结论输出为3,其实结果是4。

正确思路

看完题解之后发现,之前找规律的时候思路不严谨,有地方没有认真证明,而是凭靠直觉解题,这是做题的大忌,得改。
首先我们同样统计出cnt1,cnt2,cnt3,然后需要统计的不是简单的tot1,tot2,tot3了,我们应该将前cnt1个位置中有多少2,有多少为3分别统计,分别记为cnt12,cnt13。同样我们要得到cnt21,cnt23,cnt31,cnt32。
第一步:我们在进行数字交换的时候如果在前cnt1个位置上发现有2,并且在中间cnt2个位置上有1,这种时候我们应该优先交换这两个数字,这样1跟2都出现在应该在的位置。然后我们看前cnt1个位置上有没有3,如果有的话应该和后面cnt3个位置上的1进行交换。同理交换所有的这样的数字。
第二步:在进行完上面的操作之后剩下的数字都是什么样的呢,如:312,这个序列,我们需要进行两次交换才能将三个数字都放在应该在的位置。所以我们得到的结论如下:
首先按照按照第一步计算需要交换的次数,然后剩下的数字都需要用第二步来交换。

解题代码

/*
ID: yinzong2
PROG: sort3
LANG: C++11
*/
#define MARK
#include <cstdio>
#include <iostream>
using namespace std;int N;
int num[1010];int main() {
#ifdef MARKfreopen("sort3.in", "r", stdin);freopen("sort3.out", "w", stdout);
#endif // MARKcin >> N;int cnt[3] = {0};for (int i = 0; i < N; i++) {cin >> num[i];cnt[num[i]-1]++;}int cnt12 = 0, cnt13 = 0;for (int i = 0; i < cnt[0]; i++) {if (num[i] == 2) {cnt12++;} else if (num[i] == 3) {cnt13++;}}int cnt21 = 0, cnt23 = 0;for (int i = cnt[0]; i < cnt[0]+cnt[1]; i++) {if (num[i] == 1) {cnt21++;} else if (num[i] == 3) {cnt23++;}}int cnt31 = 0, cnt32 = 0;for (int i = cnt[0]+cnt[1]; i < cnt[0]+cnt[1]+cnt[2]; i++) {if (num[i] == 1) {cnt31++;} else if (num[i] == 2) {cnt32++;}}int ans = 0;// 第一步操作ans += min(cnt12, cnt21); cnt12 -= min(cnt12, cnt21); cnt21 -= min(cnt12, cnt21);ans += min(cnt13, cnt31); cnt13 -= min(cnt13, cnt31); cnt31 -= min(cnt13, cnt31);ans += min(cnt23, cnt32); cnt23 -= min(cnt23, cnt32); cnt32 -= min(cnt23, cnt32);// 剩下的数字需要按照第二步来操作,每个312这种序列都需要用2次交换ans += ((cnt12 + cnt13)*2);cout << ans << endl;return 0;
}

转载于:https://www.cnblogs.com/yinzm/p/7899127.html

USACO Section 2.1 Sorting a Three-Valued Sequence 解题报告相关推荐

  1. 一中OJ #3509 七的倍数 [USACO Jan16,洛谷P3131] | 同余前缀和 | 解题报告

    一中OJ | #3509 七的倍数 [USACO Jan16 Silver , Subsequences Summing to Sevens] 时限 1000MS/Case 内存 128MB/Case ...

  2. USACO 3.3.2 Shopping Offers解题报告

    写在前面:因为之前没写的C++的USACO Training的解题报告太多--所以就不写了,要是想要代码可以联系我:xiedong_1993@foxmail.com 这题就是传说中的五维背包,其实写起 ...

  3. USACO Section2.1 Hamming Codes 解题报告 【icedream61】

    hamming解题报告 ---------------------------------------------------------------------------------------- ...

  4. USACO Section2.2 Preface Numbering 解题报告 【icedream61】

    preface解题报告 ---------------------------------------------------------------------------------------- ...

  5. USACO Section 4.2 题解

    最近开始做荒废了好久的USACO,希望能够以一天一个Section的速度做完吧.题解也会每天更新. Drainage Ditches(ditch) 本题是个最基本的网络流.这里我用的Dinic算法,递 ...

  6. usaco Section 1.5 Checker Challenge 最慢0.162秒0.0+n皇后问题位运算版(C语言)

    今天做USACO做到Section 1.5的Checker Challenge 直接dfs之后的结果是,超时.. 百度查查才想起来就是八皇后问题.有人讲怎么利用对称性怎么怎么优化,我没仔细看 直到看到 ...

  7. USACO SECTION 1.1.2 Transformations 爆搜

    题目链接: http://train.usaco.org/usacoprob2?a=f6bhTTJaVRy&S=transform 题目大意: 给你一个初始矩阵和一个目的矩阵, 还有几种操作, ...

  8. USACO Section 1.2 Broken Necklace

    题目 题目分析 推的过程 需要避免的坑 整体代码 USACO的题解 题目 题目描述 输入描述 Line 1: N, the number of beads Line 2: a string of N ...

  9. [USACO Section 3.2] 01串 Stringsobits (动态规划)

    题目链接 Solution 贼有意思的 DP, 也可以用组合数学做. \(f[i][j]\) 代表前 \(i\) 位,有 \(j\) 个 \(1\) 的方案数. 转移方程很简单 : \(f[i][j] ...

最新文章

  1. Spring Boot 2.x基础教程:JSR-303实现请求参数校验
  2. python如何通过以太网发送指令_用scapy在python中编写一个以太网桥
  3. docker部署django项目、mysql主从搭建、django实现读写分离
  4. Class文件结构amp;字节码指令
  5. 解决freeswitch ICE 获取RTP地址时间过长的问题
  6. 电气通用规范_与通用电气的对话使我了解到有关开放式组织的知识
  7. POJ1009 Edge Detection
  8. android studio单个工程文件的代理设置
  9. header简单用处
  10. linux acpidtd 进程,MaciASL提取的原版的DTDS编译提示有错误,大牛帮忙看下吧。
  11. 人事面试100问题--巧妙应答
  12. 支付宝小程序前端开发简介
  13. 嵌入式软件测试——初探
  14. 2019广州大学城第二届“论客杯”青年公益微创投暨南大学校际公开赛决赛圆满落幕
  15. 基于LVD、贝叶斯模型算法实现的电商行业商品评论与情感分析案例
  16. 帆软FineBI随时记
  17. 神马笔记 版本1.3.0
  18. 35 - 用正则表达式分别提取电话号的区号、电话号和分机号
  19. 19网站实现QQ登录功能
  20. python3下安装h5py

热门文章

  1. 程序员修炼之道 pdf_程序员修炼之道-注重实效
  2. c语言取字节高四位低四位,C语言取一个数的最高位
  3. 第二章从收入的预测分析开始
  4. 为什么Spark比MapReduce快
  5. java请求参数_在Java中发送http的post请求,设置请求参数等等
  6. pyRedis - 操作指南:增/删/改/查、管道与发布订阅功能
  7. 安装 selectorgadget
  8. 手把手教你如何扩展GridView之个性分页
  9. 第18天:京东网页头部制作
  10. I.MX6 mfgtool2-android-mx6q-sabresd-emmc.vbs hacking