CF Round #500

http://codeforces.com/contest/1012

A:Photo of The Sky

题意:给你2*n个坐标,将它们变成n对二维坐标,然后用一个最小的矩形恰好包含这个n个点,问矩形最小面积是多少。’
题解:注意到答案就是(Xmax-Xmin)*(Ymax-Ymin),那么容易想到必然有一维坐标连续时面积最小。

B:Chemical table

题意:有一个n*m的周期表,当你有坐标(r1,c1),(r1,c2),(r2,c1)时可以推导出(r2,c2),现在给你q个坐标,问你还需要填多少个坐标才能推导出周期表上所有坐标。
题解:联想到图论,将其看成左边n个点右边m个点的二分图,每个坐标看成一条双向边,推导关系就等价于在同一个连通块的点之间有路径相连。那么答案就是构出的图上的连通块数量减1。

C:Hills

题意:给你n座山的高度,严格比相邻两座山高的叫做山峰,你现在可以砍掉一些山的高度,询问你得到至少有k个山峰最少要砍掉多少高度。k∈[1, n+12 n + 1 2 ]。
题解:dp[i][j][0/1/2]表示到了第i座山有j个山峰,且最后两座山的状态为00,01,10,的最小答案。

D:AB-Strings

题意:给你两个只含字符‘a’和‘b’的串s,t,你每次可以交换s和t的一个前缀,求最小的交换次数使得s串和t串一个只含有字符‘a’一个只含有字符‘b’。
题解:我们首先给两个串后面分别加上‘a’和‘b’表示两个串最后的目标字符。我们只用考虑有多少段‘a’和‘b’就可以了,那么把这个段数当做串长。当两个串都比较长我们就不停交换最靠后的两段,这样每次都是让s串和t串的总串长减2。当有一个串长为1,另一个串长大于2时,我们就从较长串移动一些到较短串,使得尽量每次操作都能让总串长度减2。

E:Cycle sort

题意:给你n个数a[1..n],你可以进行这样的操作:选择i1,i2,…in,然后a[i2]=a[i1]…a[i1]=a[in]。要求你进行最少的操作数使得这n个数为单调不降的排序,所有操作的序列长度之和不超过s。
题解:首先如果给定的数是一个排列,并且没有s这个限制,那么显然操作步数要么是1要么是2。加上s这个限制,那么考虑原来的排列由m个循环构成,一共有t个需要变的位置,那么答案是max(0,m+t-s)+min(s-t,2)。如果给定的数不是排列,s和t是定值,那么我们的目标就是让m尽可能的小,也就是让原来的序列由尽可能少的循环构成。这我们就首先当做一个排列来做,然后将那些具有相等元素的循环合并起来就好了,并查集维护就行了。复杂度是启发式合并的O(nlogn)。

F:Passports

题意:你有1个或者2个护照能够去申请签证,你有N场旅行,第i场旅行是在第si天早上开始,持续leni天,申请签证需要ti天,申请签证只能某天中午用去,旅行需要使用一个护照,那么旅行途中不能用这个护照去申请签证。问你能不能进行这N场旅行,如果能,输出方案。
1 N 22
题解:状压Dp。dp[state]表示只使用一个护照将state里面这些旅行的签证都申请完的最早时间,对于这个状态我们会将之后的时间分成了O(n)段,然后枚举一场旅行x,如果有在进行第x场旅行之前有某一段空闲的时间可以去申请签证,那么就可以更新。最后再枚举一下第一个护照去申请哪些签证判断是否可行。复杂度O( 2nn2 2 n ∗ n 2 )。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值