第一题:
题目大意:给出N个人之间转账的手续X%,求出A转给B至少要多少钱才能使B得到100元。结果保留8位小数;N<=2000
解题过程:
1.很容易看出这题的图论模型,每条边的权值就是(1-X%),只要做一次最短路即可。
2.一开始怕中间计算的时候精度的损失(感觉8位小数精度要求比较高),打算保存分子分母,然后约分什么的,不过写起来比较麻烦,调了10分钟没搞出来,然后换成double直接除开,竟然AC了。 积累个经验。
第二题:
题目大意:给出数轴上N个位置,在其中放入M个点(M<=N),使得点与点之间的最小距离 尽可能大。 求最小距离。 N<=100000
解题过程:
1.看到最小的XX最大,或者最大的XX最小,马上想到二分答案,把找答案转化成判断性问题。二分最小距离D,然后根据贪心的原则,从左到右,能放就放(距离不小于D),看能否放入M个点。水题一次排过。。
第三题:
题目大意:给出N个数字(只会是1,2,3),要求用最少的交换次数从小到大排好序。
解题过程:
1.这题颠覆了以前我”交换次数最少的排序就是选择排序“的观点,实际上如果没有相同的元素,那么这个结论是正确的。
下面是一些排序的性质:
1.允许任意两个数字交换
找循环节。如果不是序列,则先离散化一下得到一个序列,再做以下计算。
比如 17 12 16 13 14 11 15->7 2 6 3 4 1 5,对应1 2 3 4 5 6 7很明显可以得到7->1->6->3->4->5->7和2->2两个循环节,则答案就是位置7和位置1交换,位置1和位置6……,每次交换可以使一个数字落在自己的正确位置,n次交换可以使n+1个数落在正确位置。那么总的交换次数就是所有的循环节的长度-1的加和,对于7 2 6 3 4 1 5则是(6-1)+(1-1)=5,很容易得到这个值也等于数字个数减去循环节个数。 (我之前的博文中也有提到,NOIP2005篝火晚会的题解)
2.只允许相邻两个数字交换
即找逆序对的个数,每个数字要落在自己正确的位置就必须和自己后面的逆序的数字做交换。(NOIP2013 有考。)
回到这题,由于有相同的元素,做法就要改变了。。参考nocow的题解 http://www.nocow.cn/index.php/USACO/sort3
只要统计出当前在数a的位置,却要到数b的位置 的对数,;
用一个组合(a,b)表示应该排序后某个位置应该是a,但之前的是b;然后求这些组合能组成的环,结果就是所有环的长度和减去环的个数;