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牛客寒假算法基础集训营3 签到题7题(附基础集训营1-3签到题总结)