竞赛讨论区 > 【题解】牛客寒假算法基础集训营6
头像
kczno1
编辑于 2019-04-10 17:24
+ 关注

【题解】牛客寒假算法基础集训营6

牛客寒假算法基础集训营6 题解

出题

显然,有解的充要条件为

若有解:

设有 道6分题,则剩下的m-x题共n-6x分,

则剩下的题有解的充要条件为

解得

因此答案为max(0,7m-n)。

煤气灶

假设小 j 工作了 i 天,则总工资

二分答案,

判断 的时候可能会爆

移项得:

因为 a*b>=c 等价于 ( 表示 x 上取整的结果),

所以可以将乘法转化为除法,从而避免爆

项链

贪心,优先选喜爱度大的颜色。

具体来说,

将颜色按喜爱度从大到小排序,

从1到m枚举i,

每次答案加上b[i]*min(a[i],leave),

其中leave表示还剩几个珠子,一开始leave=n,每次leave减去min(a[i],leave)。

美食

i从1到n枚举,依次贪心。

对于a[i],

首先把答案加上a[i]/2,

如果a[i]是奇数且a[i+1]>0,则把a[i+1]减去1,答案加上1。

海啸

用 s[x][y] 表示 (1,1) 到 (x,y) 的答案,

则 (a,b) 到 (x,y) 的答案 =s[x][y]+s[a-1][b-1]-s[a-1][y]-s[x][b-1] 。

所以只用预处理 s[x][y] 即可。

而 s[x][y] 可以通过两次计算前缀和得到。

还有一个问题就是只保证了 ,怎么开数组?

只需要先开一个 的指针数组,然后new出来就好了。

石头剪刀布

根据获胜者的偏爱决策可以推出对战的两人的偏爱决策,所以枚举最终获胜者的偏爱决策判断一下就好了。字典序问题只需递归处理+暴力 cmp 。

时间

区间或和

如果 a=b ,那么答案 =a ;

否则

考虑a和b的二进制表示从高到低第一个不同的位i,

必定b的第i位=1,a的第i位=0。

那么可以断定,对于答案的二进制表示,

(1) 比第i位更高的那些位一定跟a相同。

(2) 第i位及比第i位更低的那些位一定为1。

(1)是显然的,(2)是由于把a中比第i位更低的那些位都置为1得到的数一定在区间[a,b]中。

肥猪

从0到n-1枚举第二种操作的使用次数step,

那么对于最终得到的编号为i的肥猪,

假如它是召唤编号为j的肥猪然后进化多次得到的,

则一定有

并且这是充要的,即它可以由这个区间的任何一个j召唤后进化多次得到。

因此只用这个区间的a[j]的最小值就是得到i的代价。

把所有i的代价相加再加上step*x就是step对应的最小代价。

注意,这个题目是一个环而不是链,这只需要将a复制一份即可。

求区间最小值有很多方法,比如单调队列。

时间复杂度

wzoi

令看题为左括号,做题为右括号,就可以用一个括号序列表示行动序列。

那么一个括号序列的价值就是,对于每个匹配的括号,如果他们推荐种类相同,+10分,否则+5分。

如果 s 中有两个连续的1或0,那么可以让他们匹配,然后删去他们,递归处理。

最终剩下来的一定是1,0交错,这时一定无法让两个相同种类匹配了,贡献可以直接算。

时间复杂度 O(n)

迷宫

注意到,对于从起始格子走到某个终止格子的方案,向右移动次数 (r) 和向左移动次数(l)的差就等于终止格子纵坐标和起始格子纵坐标的差(a),因为每次向右移动纵坐标就会 +1 ,向左移动纵坐标就会 -1 。

已经知道了 r-l=a,设 r+l=b ,则

因此当 b 取到最小值时,l 和 r 同时取到最小值。

那么对于一个格子,你只用求向右移动次数和向左移动次数的和(b)的最小值,然后解出 l,r 判断一下就好了。

从每个格子向左右的格子连边权为 1 的边,向上下的格子连边权为 0 的边,求最短路即可。

由于边权的特殊性,这个最短路可以用 bfs 来求。

就是如果用边权为 1 的边更新点,就放到队列的结尾;如果用边权为 0 的边更新点,就放到队列的开头。

时间复杂度 O(nm) 。

std

https://ac.nowcoder.com/acm/contest/332#submit/{%22searchUserName%22%3A%22kczno1%22}

全部评论

(4) 回帖
加载中...
话题 回帖

等你来战

查看全部

热门推荐