题意:输入1~N的一个排列,每次可以交换2个整数,问使排列变成1~N的一个环状排列所需的虽少交换次数.(3≤N≤500) 解法:(又是一道我没打代码,光想和看就花了很久时间的题~QwQ)由于n很小,可以暴力枚举目标的环状排列,于是贪心交换--把元素 x 直接与它的目标位置上的元素互换,这样至少使1个元素的位置正确了.而若 x 先与其他 k 个元素交换,是最多能得到 k+1 个元素的正确排列的,这样并没有之前的策略优.    另外,网上关于此题还有一种关于对链状序列找环的说法,我更加不理解.若有人…
题意:给定一个排列,每次可交换两个数,用最少的次数把它变成一个1~n的环状排列. 析:暴力题.很容易想到,把所有的情况都算一下,然后再选出次数最少的那一个,也就是说,我们把所有的可能的形成环状排列全算一下,然后选出最少的. 那么就开一个两倍的数组,然后两遍从1到n,然后每次选 n 个,进行暴力,每找一个不同的,就去找这个位置应该放的,然后交换.注意两次正序和逆序暴力. #include <iostream> #include <cmath> #include <cstdlib…
题意:输入1~n的一个排列(3<=n<=500),每次可以交换两个整数.用最少的交换次数把排列变成1~n的一个环状序列. 分析:正序反序皆可.枚举每一个起点,求最少交换次数,取最小值. 求最小交换次数solve函数,将所有不需要交换的数字用cnt统计出来,而需要交换的数字集合(个数为n)交换次数是n-1,统计一次cnt. 原因:如序列3 1 2 5 6 4,因为下标从0开始,因此将序列变为2 0 1 4 5 3,假设求以2为起点的序列正序最小交换次数,是先将2与1交换(即数字2换到位置2),再…
题意: N个外星人围成一桌坐下,有序的排列指N在N-1与N+1中间,现在给出一个序列,问至少交换几次可以得到有序的序列. 分析: 复制一遍输入序列,放在原序列之后.相当于环.通过枚举,可以把最小交换次数求出来.正向枚举后,将序列反过来再来一次. 代码: #include <iostream>#include <cstring>#include <cstdio>#include <algorithm>#include <cmath>using na…
给出一个长度不超过500的环状排列,每次操作可以交换任意两个数,求把这个排列变成有序的环状排列所需的最小操作次数. 首先把环状排列的起点固定使其成为链状排列a,枚举排好序时的状态b(一种有2n种可能),则b可以看成是原状态a的一个置换,把a变为b所需的最小交换次数即为a的长度n减去置换循环节的数量. #include<bits/stdc++.h> using namespace std; typedef long long ll; +; const int inf=0x3f3f3f3f; in…
题意:给你一个排列,每次可以交换两个整数(不一定要相邻),求最少交换次数把排列变成一个1~n的环形排列.(正反都算) 其实就是找环了,对于一个链状序列,最小交换次数等于不在对应位置的数字个数减去环的个数. 至于证明这里讲的比较详细:http://www.dewen.io/q/7967#ans16319 所以只要枚举一下环的起点就好了,dfs找环就行了. #include<bits/stdc++.h> using namespace std; ; #define bug(x) cout<&…
题意:有N条长度为1的线段,要求使每条线段分别在相应区间,且"空隙"数目最小.输出"空隙"数.(1≤N≤100000) 解法:(P.S.我这题竟做了2个多小时,还是有点迷糊......ヽ(≧□≦)ノ)先按右端点从小到大排序,再是左端点.于是有2个理解:1. 扫一遍,r保存之前的线段的右端点的最大值,分情况讨论:2. (这个我理解了差不多1个小时......qwq 于是我好不容易理解了之后,再进行了一些小修改.)l , r 表示之前线段左.右端点的范围.再分别看没有&…
题意:给定平面上N个点和一个值D,要求在x轴上选出尽量少的点,使得对于给定的每个店,都有一个选出的点离它的欧几里德距离不超过D. 解法:先把问题转换成模型,把对平面的点满足条件的点在x轴的直线上可得到一个个区间,这样就是选最小的点覆盖所有的区间的问题了.我之前的一篇博文有较详细的解释:关于贪心算法的经典问题(算法效率 or 动态规划).代码实现我就不写了.…
题意:已知 N 位选手的3题的预期得分,得分要不全拿,要不为0.且知道最后的实际名次,而且得分相同的选手,ID小的排在前面.问这样的名次可能吗.若可能,输出最后一名的最高可能得分.(N≤16384) 解法:(P.S.现在让我来做个口胡选手......(-o-) 不打算打代码了.)我有2种想法:1.排序+扫描法.将 N 位选手可能得到的所有分数 N*(1+3+3+1)>10^5 算出来,全部一起按从大到小的顺序排一次序.再扫描一遍,依次选出名次排行中当前排名的选手第一个出现的分数作为该选手的分数,…
题意:有一个由N个片段构成宽度的洞穴,已知洞顶 si 和洞底 pi 的高度,要求储存尽量多的燃料. 解法:O(n),分别从1到N和从N到1扫一遍,调整每个片段合法的最大高度,求出答案. 1 #include<cstdio> 2 #include<cstdlib> 3 #include<iostream> 4 using namespace std; 5 6 const int N=(int)1e6+10,D=1010; 7 int n; 8 int p[N],s[N],…