Time Limit: 1 second

Memory Limit: 128 MB

【问题描述】

给定一个数列{an},这个数列满足ai≠aj(i≠j),现在要求你把这个数列从小到大排序,每次允许你交换其中任意一对数,请问最少需要几次交换?

【输入格式】

第一行,正整数n (n<=100,000)。 以下若干行,一共n个数,用空格分隔开,表示数列{an},任意-231<ai<231。 <="" p="">

【输出格式】

只有一行,包含一个数,表示最少的交换次数。

Sample Input

8
8 23 4 16 77 -5 53 100

Sample Output

5

【题解】

把所有的数字从小到大排序。

然后记录这个数字它原本的位置在哪里。

比如样例的输入。

最后排序的结果是

-5,4,8,16,23,53,77,100

然后它们原来的位置是

6 3 1 4 2 7 5 8

我们这样。

从第一个元素开始。

它原来的位置是6.

现在6位置上的元素,它原来的位置是7;

而现在7位置上的元素它原来的位置是5;

现在5位置上的元素它原来的位置是2;

现在2位置上的元素它原来的位置是3;

而现在3位置上的元素它原来的位置是1;

至此我们找到了一个循环。如下。

这里的箭头起点元素表示终点元素原来的位置;

那我们可以这样。把原来的无序序列。

位置1和位置6交换。这样满足排序后位置1上的元素来自原来的位置6;

现在6位置上是1位置上的元素。

然后位置6和位置7交换。

这样满足位置6上的元素来自位置7;

然后位置7变成了1位置上的元素。

然后位置7和位置5交换。同样满足了位置7上的元素来自位置5.

然后位置5变成了1位置上的元素。

然后位置2和位置5交换。这样满足了位置5上的元素是来自位置2;

然后位置2变成了1位置上的元素。

然后位置2和位置3交换。因为此时位置2上的元素是1位置上的元素。

所以交换后位置3上的元素上是来自位置1的。而这满足了这个循环节。

然后所需要的交换次数就是箭头的个数。也即节点个数减1;

位置4上的元素还是从位置4来的。无需交换。

【代码】

#include <cstdio>
#include <cstring>
#include <algorithm> struct data //是结构体的话,会连同pre在排序的时候一起改变
{
int shuju;
int pre;
}; int n;
data a[100001];
__int64 ans = 0; void input_data()
{
scanf("%d", &n); //输入n个数字
for (int i = 1; i <= n; i++)
scanf("%d", &a[i].shuju), a[i].pre = i;//记录数据同时记录它原本的位置。一开始都在原位
} int cmp(const data &a, const data &b) //sort函数的比较函数。
{
if (b.shuju > a.shuju)//按照数据的大小升序排序
return 1;
return 0;
} void get_ans()
{
bool used[100001];
memset(used, false, sizeof(used));//判断之前有没有计算过
for (int i = 1;i <= n;i++)
if (!used[i]) //如果之前没有计算过。
{
int tot = 0;
int k = i;
while (!used[k])//一直找它原来的位置
{
used[k] = true;//同时记录已经计算过。
k = a[k].pre;
tot++;//节点个数递增
}
ans += tot - 1;//按照上面的题解。答案就是节点个数-1(也即边的个数);
}
} void output_ans()
{
printf("%I64d", ans);//输出答案
} int main()
{
input_data();
std::sort(a + 1, a + 1 + n, cmp);//没有加using namespace std;就要在前面加std::
get_ans();
output_ans();
return 0;
}

【u002】数列排序(seqsort)的更多相关文章

  1. 洛谷——P1327 数列排序

    P1327 数列排序 题目描述 给定一个数列{an},这个数列满足ai≠aj(i≠j),现在要求你把这个数列从小到大排序,每次允许你交换其中任意一对数,请问最少需要几次交换? 输入输出格式 输入格式: ...

  2. luogu 1327 数列排序 & 2017 ACM-ICPC 亚洲区(南宁赛区)网络赛 J题 循环节

    luogu 1327 数列排序 题意 给定一个数列\(\{an\}\),这个数列满足\(ai≠aj(i≠j)\),现在要求你把这个数列从小到大排序,每次允许你交换其中任意一对数,请问最少需要几次交换? ...

  3. 洛谷 P1327 数列排序

    P1327 数列排序 题目描述 给定一个数列{an},这个数列满足ai≠aj(i≠j),现在要求你把这个数列从小到大排序,每次允许你交换其中任意一对数,请问最少需要几次交换? 输入输出格式 输入格式: ...

  4. lqb 基础练习 数列排序 (sort的使用)

    基础练习 数列排序 时间限制:1.0s   内存限制:512.0MB     问题描述 给定一个长度为n的数列,将这个数列按从小到大的顺序排列.1<=n<=200 输入格式 第一行为一个整 ...

  5. 蓝桥杯 C语言 基础训练 数列排序

    问题描述 给定一个长度为n的数列,将这个数列按从小到大的顺序排列.1<=n<=200 输入格式 第一行为一个整数n. 第二行包含n个整数,为待排序的数,每个整数的绝对值小于10000. 输 ...

  6. [蓝桥] 基础练习 数列排序(java)

    问题描述 给定一个长度为n的数列,将这个数列按从小到大的顺序排列.1<=n<=200 输入格式 第一行为一个整数n. 第二行包含n个整数,为待排序的数,每个整数的绝对值小于10000. 输 ...

  7. luogu P1327 数列排序

    题目描述 给定一个数列{an},这个数列满足ai≠aj(i≠j),现在要求你把这个数列从小到大排序,每次允许你交换其中任意一对数,请问最少需要几次交换? 输入格式 第一行,正整数n (n<=10 ...

  8. 蓝桥杯BASIC-13 数列排序

    问题描述 给定一个长度为n的数列,将这个数列按从小到大的顺序排列.1<=n<=200 输入格式 第一行为一个整数n. 第二行包含n个整数,为待排序的数,每个整数的绝对值小于10000. 输 ...

  9. 蓝桥网试题 java 基础练习 数列排序

    ---------------------------------------------------------------------------------------------------- ...

随机推荐

  1. react+react-router+mobx+element打造管理后台系统---react-amdin-element

    react-admin-element,一款基于react的后台管理系统. 那么我们和其他的后台管理系统有什么区别呢? demo地址:点我进入demo演示 github地址:点我进入github 1. ...

  2. Eclipse工具修理集

    本文来自http://blog.csdn.net/liuxian13183/ ,引用必须注明出处! 俗话说:工欲善其事.必先利其器,eclipse偶尔会发发脾气,那我们要记录下"她" ...

  3. 今天看到可以用sqlalchemy在python上访问Mysql

    from sqlalchemy import create_engine, MetaData, and_ 具体的还没有多看.

  4. Activity Test1

    源代码下载(免积分) :下载 Acitivty測试的API的父类是InstrumentationTestCase.这个类可以获取Instrumentation.来操作Activity. 对于acti ...

  5. ASP.NET MVC案例教程(基于ASP.NET MVC beta)——第四篇:传递表单数据

    摘要      本文将完成我们“MVC公告发布系统”的公告发布功能,以此展示在ASP.NET MVC中如何传递处理表单的数据. 前言      通过前几篇文章,我们已经能比较自如的使用ASP.NET ...

  6. Android 设置背景透明度

    一些时候,我们须要为UI页面设置背景色,例如以下图所看到的: 上图已注: 背景颜色为#000000,透明度为40%: 那么.怎样在代码中表示呢? 首先须要了解: 颜色和不透明度 (alpha) 值以十 ...

  7. vue使用(二)

    本节目标:           1.数据路径的三种方式          2.{{}}和v-html的区别 1.绑定图片的路径 方法一:直接写路径 <img src="http://p ...

  8. 软件——机器学习与Python,输入输出的用法

    转自:http://www.cnblogs.com/graceting/p/3875438.html 输入很简单 x = input("Please input x:") Plea ...

  9. iOS开发 非常全的三方库、插件、大牛博客等等

    UI 下拉刷新 EGOTableViewPullRefresh- 最早的下拉刷新控件. SVPullToRefresh- 下拉刷新控件. MJRefresh- 仅需一行代码就可以为UITableVie ...

  10. python3 登录验证小程序,同一用户输错三次密码,锁定账户

    ''' 让用户输入用户名密码 认证成功后显示欢迎信息用户3次认证失败后,退出程序,再次启动程序尝试登录时,还是锁定状态''' # !/usr/bin/env python # -*- coding:u ...