2016XTU算法专题个人赛1 题解

来源:互联网 发布:js怎么取整数 编辑:程序博客网 时间:2024/05/16 15:38

2016XTU算法专题个人赛1 题解

A. - Taxi (CodeForces 158B)

题意: n个团队,每个团队1-4人,搭可以坐4人的车,每个团队的人必须在同一辆车上,问最少需要多少辆车?

解法: 4人团队每个一辆车;1个3人团队+1个1人团队拼一辆;2人团队每2个一辆车,单出的和2个1人团队拼;剩下的1人团队4个拼一辆。

B. Intervals (POJ 1089)

题意: 给出一些闭区间,把它们合并,要求合并成的区间数量最少,并按升序输出。
解法:

直接简单地根据左端点由小到大排好序,然后遍历过去就OK了,并把重叠的合在一起,直到发现并没有交叉的区间,然后输出之前的区间,最后把最后一次的区间输出就好了。

以上解法来源链接

C. Robbery (CodeForces 89A)

题意: n堆钻石排成一条线,每分钟可以进行m次操作(1次操作:把一颗钻石从某一堆移到另一堆 or 把一颗钻石从某一堆中装进口袋 or把一颗钻石从口袋取出放入某一堆钻石 )。要求每分钟后,相邻两堆的钻石数量不变。问k分钟后最多可以带走多少钻石。
解法: 由于要求相邻两堆的钻石数量不变,一堆钻石的数量减少,相邻的堆的钻石数量就要增加,那么对于总堆数为偶数的情况,并没有方法将钻石拿走;对于总堆数为奇数的情况,将1号堆的钻石拿走一颗放进口袋,然后将3号移一颗给2号,5号移给4号……n号移给n-1号,这样(n / 2 + 1)次操作才能拿走一颗钻石。这一组操作如果不能在一分钟内完成,则不符合题意,不能拿走钻石。能拿走的情况下,答案是时间允许的操作的组数与各奇数堆的钻石数的最小值。

参考代码链接(代码中钻石编号是从0开始的)
官方题解链接1
官方题解链接2

D. Fox and Card Game (CodeForces 388C)

题意:

给出n叠牌,每叠牌有s[i]张,然后有两个人进行游戏,A只能从牌底拿牌,B只能从牌顶拿牌,那到牌的牌面总和即为的分,两人均按照最优的方式取牌,问说最后两人的得分。

解法:

很像博弈题,但是可以用贪心做。首先对于每堆牌来说,要么奇数,要么偶数,偶数的时:两个各取一半,因为如果靠近A这边的一半牌里有很大牌面的数,那么A想取的这张牌要比B简单的多(即B拿不走这张牌,而且A同时可以对这张牌缓一缓,因为双方均均以最优方式),那么B就不会傻傻的去浪费步数争完全取不到的牌。奇数时:肯定有一方要多拿一张牌,那么谁拿走这张牌就要根据说所有奇数牌堆的中间牌大小决定的。

以上题意解法来源链接
官方题解链接

E. George and Number (CodeForces 387C)

题意:

有一个游戏的规则是这样的:给定一个正整数数组,从数组中选取两个数,将大的放在前面,小的放在后面,然后拼接在一起组成一个数,取代这两个数放在数组中。如果用同一个数组玩很多次时,最后会得到仅仅只有一个数的数组。问:给你最后那一个数,那么它的原数组最大元素数目为多大?给出的数p满足1p<10100000。注意的是,原数组只含有正整数。

解法:

这是一道贪心题。数太大,可以用字符数组表示。这样的话,贪心策略是怎样的呢?既然要使得最后元素个数最大,那么我们可以从后面开始找将串分成两个部分的子串,该子串满足:1.前面的串表示的数大于等于该串表示的数;2.该串表示的数要尽量小。找到之后计数一次,接着将前面的串当成新的串继续找,直至不能够找到为止。这样求出的解一定是最优的。

以上题意解法来源链接(xwdd博客链接)
官方题解链接

0 1