现在的位置: 首页 > 综合 > 正文

codeforces round 214 div2(全)

2014年07月18日 ⁄ 综合 ⁄ 共 1293字 ⁄ 字号 评论关闭

codeforces round 214 div2

这场比赛,做的实在是有够挫的了。。。

A题:题意坑。先给一个n,然后四行数,每行四个,找出其中的一行,满足该行中,前两个数中小的那个与后两个数中小的那个相加之后,和是否小于等于n,满足的话,就分配n,使得第一部分大于等于前两个中小的那个,另一部分大于等于后两个中的小的那个。说白了其实就是做个减法。。

B题:也是题意坑,不过这题后面有note,还是在比较快的时间内懂了(虽然我还是不知道主人公到底想干嘛!!),看下note,应该好懂的。

代码:https://code.csdn.net/snippets/81116

C题:有n个水果,每个水果有两个权值,taste和calories。这里我分别将其描述为t,c。问从中挑出若干个水果,使得这若干个水果的t之和等于c之和的k倍时,t之和最大为多少。其实就是背包,我真的是挫死了。。dp[i][j]表示前i个使得选出的水果的t之和减去k倍的c之和为j时,t之和最大为多少,然后。。没了,就这么简单了

代码:https://code.csdn.net/snippets/81123

D题:题意较难理解。给出一幅n个点,每条边的无向图,n<=2000,m<=3000。每条边有两个权值l,r。定义从1到n的某一条路径的loyalty值为,该条路经所有的边的l,r值的交集的大小。求所有的路径中,loyalty最大值为多少。

如果我们暴力做,可以枚举区间的左右端点,然后判断这个区间是否是某一条路径的交集区间的子区间,复杂度较高。可以的结论:能作为答案的区间的左端点必然是已有的区间的某一个的左端点,那么我们枚举左端点,再二分右端点就可以了。然后dfs去图里面判联通。

补充一句:不加记忆化的深搜都是耍流氓。

代码:https://code.csdn.net/snippets/81145

E题:给出一个n*m的矩阵,矩阵里的元素的值为1到k,n,m的值小于等于2000,k的值小于等于9,。然后给出一个序列num[i],求在矩阵中,所有的num[i]与num[i-1]的曼哈顿距离最大是多少。

因为k的范围很小,很容易想到的是先处理出l[i][j],表示i这个值到j这个值的距离最远是多少。考虑在第i行的值a,和在第j行的值b,那么这两行中a,b的距离只能是在i中最左边的a跟j中最右边的b组合,或者是在i中最右边的a跟j中最左边的b组合。那么我们就先预处理c[i][j][0]表示在第i行,j出现的最左边的位置,c[i][j][1]表示在第i行中,j出现的最右边得位置。接下来,考虑暴力的算法,暴力枚举元素,再暴力枚举两行算一下。但是这样复杂度还是有点高,然后就是优化了。先枚举元素,然后从上往下枚举行,用一下类似单调队列的方法,维护左边和右边的最值(这个比较抽象,多想想应该能想到)。同样的方法再从下往上扫一遍。因为i到j的最长距离跟j到i的最长距离是一样的,在上下扫完两遍之后,把l[i][j]再重新更新一遍,这样就不用担心会有遗漏了。

代码:https://code.csdn.net/snippets/81379

抱歉!评论已关闭.