UVA入门经典第八章高效算法
时光ice
这个作者很懒,什么都没留下…
展开
-
猜名次(Guess, ACM/ICPC Beijing 2006, UVa1612)
贪心 题目描述:有n个选手,每个选手做三个题。对了得相应得分,错了不得分,问能否最终得出给你的那个排名。排名规则是:分高的排名高(名次号码低),分数相同的话,ID小的排名高。 题目分析:按照给出的排名对应的选手处理相应的数据,第一名一定是三题全对,其后的人分数不能大于上一名,或者是分数相同,其ID要大于上一名。还有一个关键,对浮点数的处理,这很关键。 代码如下: #include #in原创 2017-05-10 19:37:29 · 556 阅读 · 0 评论 -
奇怪的股市(Hell on the Markets,ACM/ICPC NEERC 2008, UVa1614)
题目描述:简而言之就是给一系列数前面加个正负号,使得其和为0. 解题思路:先给这一系列数排序。如果sum是奇数一定不可行,sum必须是偶数才有解,sum/=2,按照从大到小的顺序使sum-trade[i];直到sum为0。为了记录trade[i]在原序列的位置,用一个map来定位,其键就是trade[i]的值,其值是trade[i]相同时,不同的位置,因为本题中只要trade[i]相同,也就是说原创 2017-05-11 20:06:47 · 801 阅读 · 0 评论 -
顾客是上帝(Keep the Customer Satisfied, ACM/ICPC SWERC 2005, UVa1153)
题目描述:求最少的交换次数,使给定的数字序列能成为环。 解题思路:最少交换次数的环一定是某一个数为起点的环。那便枚举1~n使之作为起点。注意环可以使顺时针增加也可以减少,所以需要再反序枚举,求出最小的交换次数。求最小的交换次数的方法是,让alien[i]=i,否则交换,此时cnt++。至于为什么这就是最小的交换次数,我现在还不能确定我的证明是正确的,现在想到的证明是 :若把一个序列通过交换变为升原创 2017-05-13 00:47:56 · 536 阅读 · 0 评论 -
起重机(Crane ACMICPC CERC 2013 UVa1611)
贪心 题目描述:给定一串数,要求把数按照给定的交换规则排成升序。交换规则:选定偶数个数把这些数的前半部分和后半部分交换,各半部分中的数不变。求交换的次数和每次交换数字序列的首端点和尾端点。 题目分析:按照选择排序法的思想,将数字i放在第i的位置,前面排好的数字就不用管了。如果数字i不在第i的位置,就进行交换。刘汝佳给的提示:2n次操作就好了,说明每位上的数最多经过两次交换可以满足i在第i的位置原创 2017-05-06 21:40:15 · 467 阅读 · 0 评论 -
习题8-14 商队抢劫者(Caravan Robbers ACMICPC NEERC 2012 UVa1616)
二分+贪心 题目描述:有n个区间,选择各区间的子区间使得各个子区间不相交,而且子区间的长度相同,求最大子区间的长度。 解题思路:二分枚举子区间长度,用贪心法判断该子区间是否满足题意。最后一步是将所得的浮点数化成分数。另外,本题对精度卡的特别严,1e-6都不行,1e-9可行。 代码如下: #include #include #include #include #include #i转载 2017-05-16 17:15:50 · 575 阅读 · 0 评论 -
生成排列(Generating Permutations, UVa11925)
题目描述:给你一个特定序列,要求你经过一定的变换规则将升序列变为给的特定序列。变换规则为:1.第一个元素和第二个元素交换. 2、首元素到尾部。 题目分析:借鉴的别人的。将一个升序列变为特定序列显然不如把这个特定序列变为一个升序列容易。那么就逆着处理,最后输出的时候倒着输出就行了。方法类似于冒泡排序的思想,若第一个元素大于第二个元素则交换,否则将最后一个元素变为首元素。注意:到第一个元素是n时,不原创 2017-05-08 19:35:23 · 586 阅读 · 0 评论