Kick Start 2019 round C 题解

A. Wiggle Walk

难度 模拟,编码,hashtable

这个题比较简单,可以直接模拟,用一个 hashtable 维护 dp[x][y][dir] [注意这里不是开数组], 因为只有 N ≤ 5 e 4 N \le 5e4 N5e4 个点所以用hashtable维护就好,复杂度 O ( n ) O(n) O(n)

code : github

B. Circuit Board

难度 RMQ

每一行都是独立的,因此可以枚举列

    for(int l = 0 ; l< c ; ++l)
        for(int r=l ; r < c ; ++r)
            compute best ans

这里需要判断每一行是否满足 max ⁡ a i [ l , … , r ] − min ⁡ a i [ l , … , r ] > k \max a_i[l,\dots,r] - \min a_i[l,\dots,r] >k maxai[l,,r]minai[l,,r]>k 因此需要快速求 [l,r] 的最大最小值,这个不就是经典的 RMQ 吗?

code : github

C. Catch Some

难度 dp,0/1 knapstack

这题是一个类似 0/1 背包的dp

一点变化是最后不需要回到原点,因此最后观察的dog是一个关键,也就是对每个type来说最后一种type是有差别的,其他没差别。

这里我借鉴了 No.1 大哥的是做法,

对于 M M M 种type A 1 , … , A M A_1,\dots,A_M A1,,AM, 计算两个方向的dp

l d p [ i ] [ k ] ldp[i][k] ldp[i][k] 仅仅考虑前 i i i 种类型,并且都是要回到原点,取 k k k 个dog的最优解。 O ( n 2 ) O(n^2) O(n2) (注意这里复杂度计算还是有一些trick的,因为对于每一个dog仅仅会考虑一次,而总共有 k k k 种观测,所以复杂度为 O ( n 2 ) O(n^2) O(n2))

r d p [ i ] [ k ] rdp[i][k] rdp[i][k] 仅仅考虑后 i i i 种类型,并且都回到原点,取 k k k 个dog 的最优解

最后考虑每一个dog作为终点的情款的最优解就好了

这里总结一个 离散化的模板

// discretize a vector
// 
// example:
// 1,10,3,5 -> 0,3,1,2
// NOTE: re-write parameter, not functional
// return : number of non-duplicated elements
int discretization(vector<int> & raw){
  
    // discretization
    vector<int> id = raw;
    sort(id.begin(),id.end());
    auto it_end = unique(id.begin() , id.end());
    for(int i=0 ; i<raw.size() ; ++i)
        raw[i] = lower_bound(id.begin(),it_end,raw[i]) - id.begin();
    
    return it_end - id.begin();
}

code github

版权声明

本作品为作者原创文章,采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议

作者: taotao

转载请保留此版权声明,并注明出处

你可能感兴趣的:(算法刷题,google,kickstart,18/19)