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牛客寒假算法基础集训营5 签到题5题

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

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

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

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

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