2016-2017 ACM-ICPC, NEERC, Southern Subregional Contest

来源:互联网 发布:中国人民大学网络登录 编辑:程序博客网 时间:2024/05/22 03:25

B.
题意:
有一个序列长度为n的数组,每次你可以选择两个数的下标,电脑会告诉你两个数的大小关系,判断次数不超过ceil(3*n/2)-2


思路:
交互题,我们可以通过观察给出的次数观察出结论,两个数可以比较三次,所以我们可以先把1和2的大小关系加入,然后每次加入两个数,先确定这两个数的大小关系,然后大的与前面大的比较,小的与前面小的比较


C.
题意:
有n个城市,m条边,然后有w个商店,每个商店有3个信息,位于哪个城市,商品总数,商品单价,有q个查询,每个查询有三个信息,哪个城市需要,需要的总数,可支付的单价(n<=5000,m<=min(5000,n*(n-1)/2,w<=5000,q<=1000)


思路:
比赛时的思路略复杂,先把w个商店按照分到不同的联通块,此时把不同联通块中的商店按照价格排序,然后就可以处理出每个城市能够到达的商店(而且价格是有序的),查询就是二分答案,最坏的时间复杂度(n*m+logn*w*q)

另一种思路:
因为商品的数量比较少,所以我们直接对原来的商品按价格排序,每一次查询,先处理出这个城市到其它所有城市的距离,然后二分答案就可以了,最坏的时间复杂度(q*m+logn*w*q)


D.
题意:
有n座桥,前一座的终点是下一座的起点,有一种药,它可以使原来的速度从0.5变为1,持续时间为r,而且两次药使用时间一定要大于等于r,
每座桥有一个长度和一个限制时间(多少时间之内要通过这座桥),问最少使用多少次药通过所有的桥.


思路:
可以把n座桥链接起来,经过分析,可以发现每次桥如果使用药,那么使用药的位置一定越晚越好(要能通过这座桥),所以我们可以二分每座桥使用药的位置(也可以直接确定,但二分时间复杂度也是可以接受的,而且好写?)


E.
题意:
给你一组分数,以及解锁后该分数的改变大小.问怎样改变解锁分数的顺序,能够使得过程中所有人排名的变化量最大.


两两比较,产生贡献


I.
题意:
有n个数,每个数有两个属性,给你两个序列,从第一个序列中取s个数,相加记为sum1,第二个序列中取q个数,但是两个序列中的数的位置不能够相同,相加记为sum2,求sum1+sum2的最大值.


思路一:
费用流,每个点向s和p各连一条流量为1,费用为3000-各自属性的边,S向每个点连流量为1,费用为3000的边,p和s向T连流量分别为p和s,费用为3000的边,跑zkw费用流(时间复杂度不对?)


思路二:
我们用dp[p][s]表示第一个序列中取了p个,第二个序列中取了s个,这样的dp方程时间复杂度显然不对(n^3左右),我们考虑进行优化
我们先将所有的位置按p的大小进行排序,我们先取前面的p个作为第一序列
接下来我们就要挑选第二个序列的位置,我们对第二个序列的位置一个一个进行挑选
如果这个位置没有用过,则增加的值为s[i],如果这个位置的值已经被第二个序列曾用了,则增加的值为0,
如果这个位置被第一个序列曾用了,增加的值为p[num]+s[i]-pi
时间复杂度为O(n*n)
(正确性的证明?类似KM的证明)


思路三:
将未用过的位置和被第一个序列用过的位置用优先队列进行优化,时间复杂度可达到O(nlogn)


J.
题意:
有n个瓶子,知道每个瓶子中液体容量,每个瓶子的总容量,求出最少装满所有液体的瓶子数,并且将一个瓶子向另一个转移一单位液体花费时间为1,在瓶子数最少的情况下求出所花时间最小值。(n<=100,ai<=100,bi<=100)


思路:
我们可以很简单的求出至少需要多少个瓶子,接下来就是一个简单的背包
dp[i][j]表示留下i个以及对应的体积至少需要的花费是多少
状态转移的时候只要考虑当前这个是否留下来就可以了
时间复杂度:1e8

把使用一个瓶子的花费定义为Base,
dp[i][j]表示前面个使用的体积为j的花费的最下值
时间复杂度:100*10000

0 0
原创粉丝点击