2022牛客寒假算法基础集训营4 签到题7题

Posted 小哈里

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2022牛客寒假算法基础集训营4 签到题7题相关的知识,希望对你有一定的参考价值。

1、E-真假签到题

  • 不难发现,或者随便枚举一下,可以得到f(n)=n的结论
#include<bits/stdc++.h>
typedef long long LL;
using namespace std;
const int maxn = 1010;
int main()
    LL x;  cin>>x;
    cout<<x;
    return 0;


2、H-真真真真真签到题

  • 紫先选择站在正方体的中心,然后小红站在正方体的一个角上。可以证明这样一定是最优的。
#include<bits/stdc++.h>
typedef long long LL;
using namespace std;
const int maxn = 1010;
int main()
    double x;  cin>>x;
    cout<<pow(sqrt(x*x*4/3),3);
    return 0;


3、K-小红的真真假假签到题题

  • 想要增加1的数量,还不能破坏原来的二进制串,又要是原串的倍数。
  • 直接把原串再写一遍就行
#include<bits/stdc++.h>
typedef long long LL;
using namespace std;
int main()
    LL x;  cin>>x;
    cout<<((x<<30)+x);
    return 0;


4、F-小红的记谱法

  • ‘<’ 代表降八度,’>‘代表升八度。那么用一个变量统计当前八度的情况,然后对应哪个音直接输出即可,后面根据八度的情况来添加对应数量的’.‘或者’*'即可
#include<bits/stdc++.h>
typedef long long LL;
using namespace std;
int main()
    string s;  cin>>s;
    int cnt = 0;
    for(char ch : s)
        if(ch=='>')cnt++;
        else if(ch=='<')cnt--;
        else
            if(ch=='C')cout<<1;
            if(ch=='D')cout<<2;
            if(ch=='E')cout<<3;
            if(ch=='F')cout<<4;
            if(ch=='G')cout<<5;
            if(ch=='A')cout<<6;
            if(ch=='B')cout<<7;
            if(cnt>0)for(int i = 0; i < cnt; i++)cout<<"*";
            else for(int i = cnt; i < 0; i++)cout<<".";
        
    
    return 0;


5、I-爆炸的符卡洋洋洒洒

  • 01背包的变种题。
    传统01背包的模型是,每个物品有一个重量和一个价值,问总重量不超过 x 能取到的最大价值。
  • 而这道题的模型变成了:总重量必须是 x的倍数时能取到的最大价值。
    解法其实是一样的,不同的是本来要维护前 i个物品重量为 j的最大值,现在变成了 前 i个物品重量模 k为 j的最大值。
  • dp[i][j]=max(dp[i−1][j],dp[i−1][(j−a[i]%k+k)%k]+b[i])
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int maxn = 1010;
LL a[maxn][2], f[maxn][maxn];
int main()
    int n, k;  cin>>n>>k;
    for(int i = 1; i <= n; i++)cin>>a[i][0]>>a[i][1];
    memset(f,0xc0,sizeof(f)); //取不到
    f[0][0] = 0;   //前0个物品,最大威力为0,消耗为0
    for(int i = 1; i <= n; i++)
        for(int j = 0; j < k; j++)
            f[i][j] = f[i-1][j]; //不取第i个
            f[i][j] =max(f[i][j], f[i-1][(j-a[i][0]%k+k)%k]+a[i][1]);//取第i个
        
    
    if(f[n][0]<=0)cout<<-1;
    else cout<<f[n][0];
    return 0;


6、C-蓝彗星

  • 给定每个彗星的种类,以及开始的时间。持续时间均为 t。问有多少时间能看到蓝彗星看不到红彗星。
  • 我们最终的目的是想知道每个时刻有没有蓝彗星和红彗星,由于每颗彗星的时间是给定的一个区间,那么可以直接对值域进行差分,最终求一个前缀和即可。
  • 维护两个差分分别代表蓝彗星和红彗星,最后枚举1-2e5,统计有蓝没红的时间,累加答案即可。
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int maxn = 2e5+10;
int s1[maxn], s2[maxn];
int main()
    int n, t;  cin>>n>>t;
    string s;  cin>>s;
    for(int i = 0; i < n; i++)
        int x;  cin>>x;
        if(s[i]=='B')s1[x]++, s1[x+t]--;
        else s2[x]++, s2[x+t]--;
    
    int res = 0;
    for(int i = 1; i < maxn; i++)
        s1[i]+=s1[i-1], s2[i]+=s2[i-1];
        res += (s1[i]&&!s2[i]);
    
    cout<<res<<"\\n";
    return 0;



7、A-R

  • 不能有p,所以选定的区间必定在两个p之间,p把原串分割成很多子串
  • 求包含至少k个R的子串即可
  • 扫一遍,遇到P就清空,遇到R就累加答案即可
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int maxn = 2e5+10;
int main()
    int n, k;  cin>>n>>k;
    string s;  cin>>s;  s="0"+s;
    LL a[maxn]=0, l = 0, ans = 0;
    for(int i = 0; i <= n; i++)
        if(s[i]=='P')
            l = 0;  a[0] = i;
        else if(s[i]=='R')
            a[++l] = i;
        
        if(l >= k)ans+=a[l-k+1]-a[0];
    
    cout<<ans<<"\\n";
    return 0;



以上是关于2022牛客寒假算法基础集训营4 签到题7题的主要内容,如果未能解决你的问题,请参考以下文章

2022牛客寒假算法基础集训营4 签到题7题

2022牛客寒假算法基础集训营4 签到题7题

2022牛客寒假算法基础集训营4 ABCDEFGHIJKL

2022牛客寒假算法基础集训营3 签到题7题(附基础集训营1-3签到题总结)

2022牛客寒假算法基础集训营3 签到题7题(附基础集训营1-3签到题总结)

2022牛客寒假算法基础集训营6 签到题5题(附基础集训营4-6签到题总结)