牛客周赛 Round 99题解

发布于:2025-07-08 ⋅ 阅读:(13) ⋅ 点赞:(0)

Round 99

思路:我们之间去用字符串去统计即可,输入一个字符串,看相邻有没有99即可

#include<bits/stdc++.h>
using namespace std;
#define int long long
string s;
signed main()
{
    cin>>s;
    int n=s.size();
    for(int i=1;i<n;i++)
    {
        if(s[i-1]=='9'&&s[i]=='9')
        {
            cout<<"YES\n";
            return 0;
        }
    }
    cout<<"NO\n";
    return  0;
}

缺陷型电脑

思路:怎么说呢?其实就是去看输入的字符串里面最大的ascii码值是多少,输出这个最大的码值即可

我们之间用字符减去‘a’+97即可

找到最大值

#include<bits/stdc++.h>
using namespace std;
#define int long long
int t;
int n;
string s;
void solve()
{
    cin>>n;
    cin>>s;
    int ans=0;
    for(char c:s)
    {
        ans=max(ans,c-'a'+97LL);
    }
    cout<<ans<<"\n";
}
signed main()
{
    cin>>t;
    while(t--)
    {
        solve();
    }
    return 0;
}

小苯的洞数构造

思路:基本上最高位用4或者8,后面全部用8即可,如果是0,就输出1,否则就是按照洞数去构造

4,8,48,88,488,888这种序列即可

 

#include<bits/stdc++.h>
using namespace std;
#define int long long

int k;
void solve()
{
    cin>>k;
    int cnt8=k/2;
    int cnt4=k%2;
    for(int i=1;i<=cnt4;i++)
        cout<<"4";
    for(int i=1;i<=cnt8;i++)
        cout<<"8";
    cout<<"\n";
}
signed main()
{
    int t;
    cin>>t;
    while(t--)
    {
        solve();
    }
    return 0;
}

前缀和

思路:其实这题只有在奇偶性变换的时候才会用到计数,否则都是偶数,找到规律直接写即可

那么什么时候回出现奇偶性变换呢?就是当p%x==0的时候

#include<bits/stdc++.h>
using namespace std;
#define int long long
int t;
int x,p;
void solve()
{
    cin>>x>>p;
    if(p%x==0)
    {
        cout<<(p/x)*2-1<<"\n";
    }
    else
    {
        cout<<(p-(p/x))*2<<"\n";
    }
}
signed main()
{
    cin>>t;
    while(t--)
    {
        solve();
    }
    return 0;
}

小宇

思路:其实仔细想想这道题,其实会将整个序列分成两部分,左部分,会将当前位置的值都变成下标,右半部分就是不需要变化的,我们只需要枚举从哪个位置开始进行右半部分即可,我们可以知道右半部分的值一定是ai>=i的,并且ai<ai+1的,我们只需要去统计左半部分的数的种类,就是最后的答案了

#include<bits/stdc++.h>
using namespace std;
#define int long long
int t;
int n;
int a[200005];
void solve() {
    int n;
    cin >> n;
    vector<int> a(n);
    map<int, int> cnt, mp;
    for (int i = 0; i < n; i++) 
    {
        cin >> a[i];
        cnt[a[i]]++;
    }

    int c = 1E9;
    for (int i = n - 1; i >= 0; i--) 
    {
        if (a[i] <= i || a[i] >= c || cnt[a[i]] > 1 || mp.count(a[i])) 
        {
            mp[a[i]] = 1, c = i + 1;
        } 
        else 
        {
            c = a[i];
        }
    }
    cout << mp.size() << '\n';
}
signed main()
{
    cin>>t;
    while(t--)
        solve();
    return 0;
}

汉堡猪猪分糖果

思路:将n个糖果分到m个人手上,算其与的值,然后想让这个值最大,那么我们知道只有当m个人在这一位都是1的时候,与出来才是1,因此我们可以从最高位开始枚举,也就是第31位,判断剩下的n是否大于等于m*(1<<bit)如果大于等于,就可以直接让这一位全部变成1

否则 我们要去看剩下的是否能让当前位后面的全部变成1,如果不能,就直接跳过,如果可以就在这一位补充k个人有即可,我们可以列一个式子

n-k*(1<<bit)<=m*(1<<bit)-m

不等式的左边表示剩下的总的个数减去k个有糖果的

不等式的右边表示将剩下的位置填满所需的代价,这个是一定满足的

然后最后算k向上取整即可

#include<bits/stdc++.h>
using namespace std;
#define int long long
int t;
int n,m;
void solve()
{
    cin>>n>>m;
    int ans=0;
    for(int i=31;i>=0;i--)
    {
        int v=1LL<<i;
        int cost=m*v;
        if(n>= m*(1LL<<i))
        {
            n-=m*(1LL<<i);
            ans+=(1LL<<i);
        }
        else{
            cost-=m;//后面全1的代价
            if(n<=cost)
                continue;
            int k=(n-cost+v-1)/v;
            n-=k*v;
        }
    }
    cout<<ans<<"\n";
}
signed main()
{
    cin>>t;
    while(t--)
    {
        solve();
    }
    return 0;
}


网站公告

今日签到

点亮在社区的每一天
去签到