2021牛客OI赛前集训营-普及组题解(第三场)

普及组题解

T1 反码

使用字符串进行读入,按照题意模拟即可

T2 异或

我们发现在循环移位的时候,结果的改变只与个别位置有关。例如数组长度为 3,则刚开始时数组的价值为 ^ + ^ ,向右循环一次之后变为 ^ + ^ ,其中只少了一个 ^ 的值,多了一个 ^ 的值,其余部分是不变的。(对于更长的数组也可以用类似的方法进行推演)

得到此结论之后,我们只需要关注在循环移动的同时,哪一对异或值消失了,哪一对异或值增加了,就可以得到答案。

#include <iostream>
using namespace std;
const int maxn = 1e5 + 5;
int a[maxn], num[maxn];
int main(){
    int n, q, m;
    cin >> n >> m;
    for(int i = 0; i < n; i++){
        cin >> a[i];
    }
    int last = n - 1, now = n - 1;
    long long ans = 0;
    for(int i = 0; i < n; i++){
        num[i] = a[i] ^ a[(i+1)%n];
        if(i != n - 1)    ans += num[i];
    }
    cout << ans << " ";
    while(m--){
        cin >> q;
        now = ((now - q) % n + n) % n;
        ans = ans + num[last] - num[now];
        last = now;
        cout << ans << " ";
    }

}

T3 最大公约数

从大到小枚举答案,假设 gcd 为 k,则说明 [l,r] 的区间之内至少要有 2 个 k 的倍数,这样才可以凑出两个数字 gcd 为 k。

对于区间内是否有 2 个 k 的倍数,我们可以用前缀和作差的方式算出——即 1~r 之间 k 的倍数有 r/k 个,1~(l-1) 之间 k 的倍数有 r/(l-1) 个,作差即可得到 [l,r] 中 k 的倍数的数量

#include 
using namespace std;
int main(){
    int i = 1e7, l, r;
    for(cin >> l >> r; (r / i - (l - 1) / i) < 2; i--);
    cout << i << endl;
}

T4 波浪

定义 dp[i][0/1][0/1] 为扫描到数组的 i 位置,且此位置比上一位置小/大,此位置改动/没改动过所需要的最小改动次数。

只记录大小关系是不行的,因为有可能通过改变而修改了这个数字和前一个数字的大小关系。只记录是否改变过也不行,因为不知道上一个数字和之前的大小关系,就无法确定这个数字应该改得更大还是更小。

知道状态之后,我们进行分类讨论:例如本身这个数字就比上一个大,比上一个小,和上一个数字相等。

讨论这三种不同的情况即可得到答案。

#include 
using namespace std;
const int maxn = 1e5 + 5;
int dp[maxn][2][2], a[maxn];
// 0 small 1 big
// 0 change 1 notchange
int main(){
    int n, q;
    cin >> n;
    for(int i = 1; i <= n; i++)
        cin >> a[i];
    memset(dp, 0x3f, sizeof dp);
    dp[1][1][1] = dp[0][0][1] = 0;
    if(a[2] > a[1]){
        dp[2][1][0] = dp[2][0][1] = dp[2][0][0] = 1;
        dp[2][1][1] = 0;
    }else if(a[2] < a[1]){
        dp[2][1][1] = dp[2][0][0] = dp[2][1][0] = 1;
        dp[2][0][1] = 0;
    }else{
        dp[2][0][0] = dp[2][1][0] = dp[2][0][1] = dp[2][1][1] = 1;
    }
    for(int i = 3; i <= n; i++){
        if(a[i] > a[i-1]){
            dp[i][1][1] = min(dp[i-1][0][0], dp[i-1][0][1]);
            dp[i][0][0] = min(dp[i-1][1][0], dp[i-1][1][1]) + 1;
            dp[i][0][1] = dp[i-1][1][0];
            dp[i][1][0] = dp[i][1][1] + 1;
        }else if(a[i] < a[i-1]){
            dp[i][0][1] = min(dp[i-1][1][0], dp[i-1][1][1]);
            dp[i][1][0] = min(dp[i-1][0][0], dp[i-1][0][1]) + 1;
            dp[i][1][1] = dp[i-1][0][0];
            dp[i][0][0] = dp[i][0][1] + 1;
        }else{
            dp[i][1][1] = dp[i-1][0][0];
            dp[i][0][1] = dp[i-1][1][0];
            dp[i][0][0] = min(dp[i-1][1][0], dp[i-1][1][1]) + 1;
            dp[i][1][0] = min(dp[i-1][0][0], dp[i-1][0][1]) + 1;
        }
//        cout << i << " " << dp[i][0][0] << " " << dp[i][0][1] << " " << dp[i][1][0] << " " << dp[i][1][1] << endl;
    }
    cout << min(min(dp[n][0][1], dp[n][0][0]), min(dp[n][1][0], dp[n][1][1])); 
}
全部评论
灵异#include
点赞
送花
回复
分享
发布于 2021-10-10 20:52

相关推荐

感觉这一周太梦幻了,就像一个梦,很不真实~~~感觉这个暑期,我的运气占了99成,实力只有百分之一4.15上午&nbsp;腾讯csig&nbsp;腾讯云部门,面完秒进入复试状态4.16下午&nbsp;美团优选供应链部门,4.18上午发二面4.17晚上&nbsp;阿里国际一面,纯拷打,面完我都玉玉了4.18下午&nbsp;阿里国际二面,是我们leader面的我,很轻松~~4.18晚上&nbsp;约了hr面4.19上午&nbsp;hr面,下午两点口头oc4.19晚上&nbsp;意向书说起来我的暑期好像一次都没挂过~~~~~难道我是天生面试圣体?----------------------------------------------------------------------六个月前,我还是0项目0刷题,当时想的是先把论文发出来再去找实习。结果一次组会,老师打破了我的幻想(不让投B会,只让投刊或者A)我拿头投啊!!!然后就开始物色着找实习,顺便做完了mit的6.s081,但是基本上还是没刷过题目-----------------------------------------------------------------------11月&nbsp;&nbsp;一次偶然的机会,面进了某个耳机厂的手环部门,大概是做嵌入式的,用的是CPP。12月&nbsp;莫名其妙拿到了国创的面试机会,0基础四天速成java基础!居然也给我面过了hhhhh,可能是面试没写题吧入职国创后的几个月,一直没活,天天搁那看剧,都快忘了还有暑期实习这回事了~~~~命运的齿轮在2.26开始转动,因为这一天美团开了,我开始慌了,因为那时的我什么都不会。lc,八股,sql全部是0进度。然后就开始了女娲补天,上班刷题,下班继续做之前的开源,顺便学一学八股。3月到现在,lc也刷到快200了,一天最多提交了47次~~~~~~~~~~八股根据别人的面经总结和博客,写了快十万字的笔记~~~~~~~~~~简历上的实习经历和开源,也努力去深挖了,写了几万字的记录~~~~~~所以面试的时候,基本上都能cover了,面试官问到的基础基本都会,不基础的我就把他往我会的地方引。结果好像还不错,基本上每个面试官评价都挺好的emmmmmmmm
投递阿里巴巴等公司10个岗位
点赞 评论 收藏
转发
1 收藏 评论
分享
正在热议
# 牛客帮帮团来啦!有问必答 #
1152186次浏览 17149人参与
# 通信和硬件还有转码的必要吗 #
11209次浏览 101人参与
# 不去互联网可以去金融科技 #
20508次浏览 258人参与
# 和牛牛一起刷题打卡 #
19030次浏览 1635人参与
# 实习与准备秋招该如何平衡 #
203436次浏览 3627人参与
# 大厂无回复,继续等待还是奔赴小厂 #
4979次浏览 30人参与
# OPPO开奖 #
19229次浏览 267人参与
# 通信硬件薪资爆料 #
265971次浏览 2484人参与
# 国企是理工四大天坑的最好选择吗 #
2229次浏览 34人参与
# 互联网公司评价 #
97719次浏览 1280人参与
# 简历无回复,你会继续海投还是优化再投? #
25039次浏览 354人参与
# 0offer是寒冬太冷还是我太菜 #
454917次浏览 5124人参与
# 国企和大厂硬件兄弟怎么选? #
53924次浏览 1012人参与
# 参加过提前批的机械人,你们还参加秋招么 #
14647次浏览 349人参与
# 硬件人的简历怎么写 #
82290次浏览 852人参与
# 面试被问第一学历差时该怎么回答 #
19404次浏览 213人参与
# 你见过最离谱的招聘要求是什么? #
28222次浏览 248人参与
# 学历对求职的影响 #
161255次浏览 1804人参与
# 你收到了团子的OC了吗 #
538781次浏览 6387人参与
# 你已经投递多少份简历了 #
344278次浏览 4963人参与
# 实习生应该准时下班吗 #
96990次浏览 722人参与
# 听劝,我这个简历该怎么改? #
63525次浏览 622人参与
牛客网
牛客企业服务