UVa 120 Stacks of Flapjacks【构造】
题目大意:
一叠煎饼等待翻转,每个煎饼上有一个编号代表其大小,每次翻转是选择一个数$k$,将从锅底数第$k$张上面的煎饼全部翻过来,即原来的煎饼现在到了下面。请设计一种方法使得所有煎饼按照从小到大的顺序排列,即最上边的最小。
解题思路:
每次查找不满足要求的位置,将它翻转到顶端后再翻转到自己应该在的位置。为了满足无后效性,我们每次都找最大的元素。
MyCode:
1 |
|
UVa 1605 Building for UN【构造】
题目大意:
设计一个包含若干层的大楼,每层都是一个等大的网格,要求给每个格子分配一个字母,使得任意两个不同的字母都有一对相邻的格子。要求设计的大楼不超过$1000000$个格子。
解题思路:
因为层数、行数、列数都可以自己选,那我可以直接选择两层,每层都是$n \times n$的,第一层的第$i$行全是国家$i$,第二层的第$j$列全是国家$j$。
MyCode:
1 |
|
UVa 1152 4 Values whose Sum is 0【二分】
题目大意:
给定$4$个$n$元素的集合$A$、$B$、$C$、$D$,要求分别从里面选出一个元素$a$、$b$、$c$、$d$,使得$a + b + c + d = 0$,问有多少种选法。
解题思路:
将$A$、$B$合并,$C$、$D$合并,分别排序然后对其中一个数组的元素进行遍历$x_i$,从另一个数组中找是否存在$y = -x_i$就可以了。
MyCode:
1 |
|
UVa 11134 Fabled Rooks【问题分解】【贪心】
题目大意:
在一个$n \times n$的棋盘上放置$n$枚棋子,使得任意两者之间既不同行也不同列,并且每个棋子都在规定的范围$(xl_i, yl_i) - (xr_i, yr_i)$内。
解题思路:
互相攻击的条件为在同一行或者同一列,则不互相攻击的情况就是既不在同一行也不在同一列,又因为行和列是无关的,那我们就可以把这个问题分解为两个一维的问题来解决了。
对于$x$坐标来说,我们要做的就是在将$n$个点分配完毕后,每个区间都至少包含一个点。而分配是采用贪心的策略——即对所有可分配的区间找到右边界最小的区间进行分配。$y$坐标同理。
MyCode(参考LRJ’s code):
1 |
|
UVa 11054 Wine trading in Gergovia【等价转换】
题目大意:
直线上有$n$个村庄,每个村庄要么买酒要么卖酒,设第$i$个村庄的需求为$a_i$,$\sum_{i = 1}^{i = n} a_i = 0$。
把$k$个单位的酒从村庄运到相邻村庄需要$k$个单位的劳动力,计算最少需要多少劳动力可以满足所有村庄的需求。
解题思路:
因为最终供需平衡,所以不管你这个酒是从哪来的最终一定会全部抵消。为了使花费的劳动力最小,就是不得不运的时候才运。我们直接从最左边的村庄开始向右边遍历,如果可以卖那就卖掉,无法卖掉就带着继续走。当买的时候也一样,当前需要再买多少先记着,等碰到可以买的村庄时再一块买了,花费的劳动力等同于从这里的酒卖到目的村庄。
感想:
这个等价转换的思想让我想起了有道蚂蚁的题目,两者碰到后掉头,可以转化为直接穿了过去。
MyCode:
1 |
|
UVa 1606 Amphiphilic Carbon Molecules【极角排序+扫描】【贪心】
题目大意:
平面上有$n$个点,每个点不是黑的就是白的,现在要放一个隔板,把它们分成两部分,使得一侧的白点数加上另一侧的黑点数最多。隔板上的点可以看做任意一侧。
解题思路:
首先假设直线经过两个点,否则可以移动直线使其经过两个点,并且总数不会减少。
最简单的想法就是枚举两个点,然后输出两侧的黑白点的个数。
跟进一步的做法是先找一个基准点,让隔板绕该点旋转。每当隔板扫过一个点就动态修改两侧的点数。在此之前,需对所有点相对于基准点(即将基准点看做(0,0))进行极角排序。
小技巧:
如果将所有的黑点以基点为中心做一个中心对称,则符合要求的点的个数就变成了直线一侧的点的个数。
LRJ’s Code:
1 | // UVa1606 Amphiphilic Carbon Molecules |
UVa 11572 Unique Snowflakes【滑动窗口】
题目大意:
输入一个长度为$n$的序列,找一个尽量长的连续子序列,使得该序列中没有相同的元素。
解题思路:
对元素下标进行存储,向前延伸的过程中更新答案。
MyCode:
1 |
|
UVa 1471 Defense Lines【】
题目大意:
解题思路:
MyCode:
1 |
UVa 1451
题目大意:
解题思路:
MyCode:
1 |
UVa 714 Copying Books【二分】【最小化最大值】
题目大意:
将包含$m$个整数的序列划分为$k$段,使得每段的数的和最小。
解题思路:
将最优化问题转化为判定性问题,求出最小的区间和之后,按照格式输出。
要求的格式比较恶心,如果有多解要求前面的区间和尽量小。
MyCode:
1 |
|
UVa 10954 Add All【贪心】【Huffman编码】
题目大意:
给定一个包含$n$个数的集合,每次从中删除两个数并将其和放回集合,直到剩下一个数。每次的代价为两个数的和,求最小代价。
解题思路:
这就是Huffman编码的建立过程,数据范围较小,利用priority_queue
可轻松解决。
MyCode:
1 |
|
UVa 12627 Erratic Expansion【】
题目大意:
有一个红气球,每小时后会变成三个红气球 + 一个蓝气球,一个蓝气球每小时会变成4个蓝气球,分布情况如题中图片所示。
问经过$k$小时后,第$a$ ~ $b$行有多少个红气球。
解题思路:
MyCode:
1 |
UVa 11093 Just Finish it up【枚举】
题目大意:
环形跑道上有$n$个加油站,第$i$个加油站可以加$p_i$单位的汽油,从第i个到下一个加油站需要消耗$q_i$单位的汽油。油桶初始为空,假设油桶无限大,问你能否选择一个加油站作为起始位置,使得汽车可以走完一圈回到起始位置。
解题思路:
枚举起始位置就可以。如果当前枚举的位置到达某一个点$x$时汽油不够无法继续前行,则他之前的位置都不可以作为起始位置。根据这个我们可以在$O(n)$时间内解决问题。
PS:懒得通过取余之类的操作特判环形之类的,就直接将数组扩大了一倍,再存一遍。
MyCode:
1 |
|
UVa
题目大意:
解题思路:
MyCode:
1 |
UVa
题目大意:
解题思路:
MyCode:
1 |
UVa
题目大意:
解题思路:
MyCode:
1 |
UVa
题目大意:
解题思路:
MyCode:
1 |
UVa
题目大意:
解题思路:
MyCode:
1 |
UVa
题目大意:
解题思路:
MyCode:
1 |