【u002】数列排序(seqsort)
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)的更多相关文章
- 洛谷——P1327 数列排序
P1327 数列排序 题目描述 给定一个数列{an},这个数列满足ai≠aj(i≠j),现在要求你把这个数列从小到大排序,每次允许你交换其中任意一对数,请问最少需要几次交换? 输入输出格式 输入格式: ...
- luogu 1327 数列排序 & 2017 ACM-ICPC 亚洲区(南宁赛区)网络赛 J题 循环节
luogu 1327 数列排序 题意 给定一个数列\(\{an\}\),这个数列满足\(ai≠aj(i≠j)\),现在要求你把这个数列从小到大排序,每次允许你交换其中任意一对数,请问最少需要几次交换? ...
- 洛谷 P1327 数列排序
P1327 数列排序 题目描述 给定一个数列{an},这个数列满足ai≠aj(i≠j),现在要求你把这个数列从小到大排序,每次允许你交换其中任意一对数,请问最少需要几次交换? 输入输出格式 输入格式: ...
- lqb 基础练习 数列排序 (sort的使用)
基础练习 数列排序 时间限制:1.0s 内存限制:512.0MB 问题描述 给定一个长度为n的数列,将这个数列按从小到大的顺序排列.1<=n<=200 输入格式 第一行为一个整 ...
- 蓝桥杯 C语言 基础训练 数列排序
问题描述 给定一个长度为n的数列,将这个数列按从小到大的顺序排列.1<=n<=200 输入格式 第一行为一个整数n. 第二行包含n个整数,为待排序的数,每个整数的绝对值小于10000. 输 ...
- [蓝桥] 基础练习 数列排序(java)
问题描述 给定一个长度为n的数列,将这个数列按从小到大的顺序排列.1<=n<=200 输入格式 第一行为一个整数n. 第二行包含n个整数,为待排序的数,每个整数的绝对值小于10000. 输 ...
- luogu P1327 数列排序
题目描述 给定一个数列{an},这个数列满足ai≠aj(i≠j),现在要求你把这个数列从小到大排序,每次允许你交换其中任意一对数,请问最少需要几次交换? 输入格式 第一行,正整数n (n<=10 ...
- 蓝桥杯BASIC-13 数列排序
问题描述 给定一个长度为n的数列,将这个数列按从小到大的顺序排列.1<=n<=200 输入格式 第一行为一个整数n. 第二行包含n个整数,为待排序的数,每个整数的绝对值小于10000. 输 ...
- 蓝桥网试题 java 基础练习 数列排序
---------------------------------------------------------------------------------------------------- ...
随机推荐
- [Node] Stateful Session Management for login, logout and signup
Stateful session management: Store session which associate with user, and store in the menory on ser ...
- 利用 istio 来对运行在 Kubernetes 上的微服务进行管理
尝试在一个准生产环境下,利用 istio 来对运行在 Kubernetes 上的微服务进行管理. 这一篇是第一篇,将一些主要的坑和环境准备工作. 内容较多,因此无法写成手把手教程,希望读者有一定 Ku ...
- golang encoding/json
package main import ( "bytes" "encoding/json" "fmt" ) type ColorGroup ...
- Codeforces 232A - Cycles (构造 + 思维)
题目链接: 232A - Cycles(点击打开) 题意: 要构成一个存在 \(k\) 个三元环的图,需要多少个点,输出顶点数 \(n\),并输出图. 题解: 题目中的任何图都可以用 \(90\)~ ...
- 自旋锁spinlock解析
1 基础概念 自旋锁与相互排斥锁有点类似,仅仅是自旋锁不会引起调用者睡眠.假设自旋锁已经被别的运行单元保持.调用者就一直循环在那里看是否该自旋锁的保持者已经释放了锁."自旋"一词就 ...
- POJ 1595 Prime Cuts (ZOJ 1312) 素数打表
ZOJ:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=312 POJ:http://poj.org/problem?id=159 ...
- 【例题 6-4 UVA - 11988】Broken Keyboard (a.k.a. Beiju Text)
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 会链表的插入操作的话.这个就不难了. 放置两个哨兵节点. 然后模拟插入一个节点的过程就好. 实时修改光标就好->即下一个插入的 ...
- IQMath是什么 浮点转定点运算,dsp
[转帖注明出处:blog.csdn.net/lanmanck] 网上搜了一下没发现非常合适的,特写出来与大家分享. 大家都知道嵌入式系统里带浮点运算指令的CPU都比較少,TI的DSP也是定点的廉价. ...
- [AngularFire2] Pagination
Let's see how to do pagination in Firebase: For the init loading, we only want 3 items: findLessonsK ...
- 在scala中调用java代码
详细代码请见https://github.com/lujinhong/scalademo 在scala中调用java代替非常非常简单,直接调用即可 (一)一个简单示例 1.创建一个java类 pa ...