UVa 387 - A Puzzling Problem
链接
题意
给出一些拼图碎片,输出拼好后的\(4*4\)的正方形,无解输出“No solution possible”。
思路
预处理出所有拼图可能的位置的二进制码,然后dfs求解。碎片的个数总是16,可以作为剪枝。
代码
1 |
|
给出一些拼图碎片,输出拼好后的\(4*4\)的正方形,无解输出“No solution possible”。
预处理出所有拼图可能的位置的二进制码,然后dfs求解。碎片的个数总是16,可以作为剪枝。
1 | #include <cstdio> |
给出\(a,b\)求,输出从分母从1到\(b\)的最接近\(a/b\)的分数,输出要保证精度不断上升,如果精度下降则不输出。
枚举分母计算。
1 | #include <cstdio> |
有\(n\)个bookyard,每个上面有\(b_i\)个pruls,价格不同,每个bookyard上的prul必须连续购买,每个买入的prul可以卖10 florins。输出可以获得最大收益的购买方案。
求出前缀和,取每个书架前缀和的最大值即为最大收益。至于方案,dfs后保留10个最小值。
1 | #include <cstdio> |
有\(n\)个鱼塘在一条线上,给出每个鱼塘最初钓鱼5分钟的收益和每钓5分钟收益的下降值,鱼塘间的距离。用\(h\)小时钓鱼,起点在1号鱼塘,输出收益最大的方案和最大收益,多解时要求输出编号小的鱼塘钓鱼时间尽量长的解。
枚举最远走到第i个鱼塘,将走路的时间减去,然后用堆取每次钓鱼的最大收益。有个trick是鱼塘初始的5分钟钓鱼数量可能已经为0,不要放入堆。
1 | #include <cstdio> |
有\(n\)座灯塔,第一个高度为\(a\),第\(n\)个高度为\(b\),其余的高度满足公式\(h[i]=(h[i-1]+h[i+1])/2+1\),给出\(a\),求最小的\(b\)。
二分第二个灯塔的高度,然后可以计算出所有灯塔的高度,取\(b\)的最小值。
1 | #include <cstdio> |
给出计算公式,求最小值。
枚举全盘列。
1 | #include <cstdio> |
开关灯类问题,给出\(n*m(1 \leq n,m \leq 5)\)的矩阵,开始全灭,再给出开灯的影响矩阵,输出让所有灯全亮开灯次数最少的方案,无解输出“Impossible.”。
可以枚举第一排之后验证,但感觉不太好写。于是直接用中途相遇搞了,枚举一半的灯最后的状态,再枚举另一半,如果两者异或为全集,就可以完成,选择开灯次数最小的输出。时间复杂度\(O(2^{n/2}logn)\),略差于枚举第一排的算法,但对于这个数据量来说,足够了。
1 | #include <cstdio> |
给出用由\(a,b,c\)构成的字符串构造图的方法:当\(s[i]=s[j]\)或\(s[i]\)与\(s[j]\)在字母表中相邻时,\(i,j\)之间有一条边。给出一个图,问能否转化成字符串,若能,输出任意解。
首先可以确定所有的\(b\),显然\(a,c\)是等价的。对于第一个不是\(b\)的字母,任意指定\(a\)或\(c\),然后对不与它相连的填充相对的字母。其他的可以依次填充出来。填充完成后,注意检验是否完全满足原图的条件。
1 | #include <cstdio> |
给出\(n\)个数字,输出一段Pascal代码对其排序,每两个数字只能进行一次比较。
插入排序的思想,每次新的数与原数字依次比较,找到插入的位置就继续下一个数字。
1 | #include <cstdio> |
给出\(n\)个工作,但你只需要自己做\(m\)个,其他的找代理做,有\(l\)个代理,每个代理的收费不同,但都包含两项:1、收费\(A\),完成一项工作;2、收费\(B\),完成一半的工作(向上取整)。输出对所有代理收费排序后的序列。
对每个代理,优先使用第二种方案,求出花费,然后排序。数据读入上,使用类正则表达式更加方便。
1 | #include <cstdio> |