2022牛客寒假算法基础集训营5 签到题5题
Posted 小哈里
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2022牛客寒假算法基础集训营5 签到题5题相关的知识,希望对你有一定的参考价值。
1、J.三国小孩
- 己方每出一张牌对方也得跟一张才能免除伤害,直接判断n+m是否大于k即可
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int maxn = 2e5+10;
int main()
int n, m, k; cin>>n>>m>>k;
if(n+m>k)cout<<"YES\\n";
else cout<<"NO\\n";
return 0;
2、G.163小孩
- 能瞎算出来18395就行,暴力也行
#include<bits/stdc++.h>
using namespace std;
int main()
cout<<"18395";
return 0;
3、A.疫苗小孩
- 可以发现1针和0针的贡献都为0,所以直接考虑2针及以上的情况
- 枚举第二针所在的位置pos,二分找到离pos+k和pos-k最近的两个点计算最大贡献即可
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int maxn = 1e6+10;
LL a[maxn], tot;
int main()
int n; string s; cin>>n>>s;
LL k, w, q; cin>>k>>w>>q;
for(int i = 0; i < n; i++)//能打疫苗的时间
if(s[i]=='0')a[++tot]=i+1;
LL res = 0;
a[0] = -1e18, a[tot+1] = 1e18;
for(int i = 2; i < tot; i++)//枚举第2针所在的位置
int x = a[i]-k, y = a[i]+k;
int p = lower_bound(a+1,a+tot+1,x)-a;
int d = lower_bound(a+1,a+tot+1,y)-a;
int xx = min(abs(x-a[p]),abs(x-a[p-1]));
int yy = min(abs(y-a[d]),abs(y-a[d-1]));
res = max(res, max(0LL,w-xx*q)+max(0LL,w-yy*q));
cout<<res<<"\\n";
return 0;
4、I-兔崽小孩
- 将每个时间段取出来从大到小排序,对于每次询问二分查找最小的满足大于等于k的时间段下标,判断前缀和-下标*k是否大于等于p即可
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int maxn = 1e6+10;
LL t[maxn], s[maxn];
int main()
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int n, q; cin>>n>>q;
for(int i = 1; i <= n; i++)cin>>t[i];
for(int i = 1; i < n; i++)t[i]=t[i+1]-t[i];
n--;
sort(t+1,t+n+1);
for(int i = 1; i <= n; i++)s[i]=s[i-1]+t[i];
while(q--)
int k, p; cin>>k>>p;
int x = lower_bound(t+1,t+n+1,k)-t-1;
if(s[n]-s[x]-(LL)(n-x)*k>=p)cout<<"Yes\\n";
else cout<<"No\\n";
return 0;
5、D-数位小孩
- 首先这题确实可以直接数位DP(X)
- 不过从素数环角度入手的话就会发现实际上10^10内满足条件的数字数量级为百万,可以直接dfs出所有素数环并找其中带数位1的,特别的1不是素数环但也满足条件复杂度O(能过)
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
bool pri[20]=0,0,1,1,0,1,0,1,0,0,0,1,0,1,0,0,0,1,0,1;
LL l, r, ans;
void dfs(LL n, LL lst, bool have1)
if(n > r)return ;
if(n>=l && have1)ans++;
for(LL i = 0; i <= 9; i++)
if(pri[i+lst])dfs(n*10+i,i,(have1||i==1));
int main()
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
cin>>l>>r;
for(int i = 1; i <= 9; i++)dfs(i,i,(i==1));
cout<<ans<<"\\n";
return 0;
以上是关于2022牛客寒假算法基础集训营5 签到题5题的主要内容,如果未能解决你的问题,请参考以下文章
2022牛客寒假算法基础集训营3 签到题7题(附基础集训营1-3签到题总结)