花开堪折直须折,|

园龄:粉丝:关注:

2025牛客寒假算法基础集训营6

A

复制的数增加到原数之后,说明连续相同的数有几段,原数就有多少个数字

点击查看代码
#include<bits/stdc++.h>

using namespace std;
int n;
int t;
const int maxn=1e5+10;
int b[maxn];
map<int,int>mp;
void solve(){
    cin>>n;mp.clear();
    for(int i=1;i<=n;++i){
        cin>>b[i];
    }
    int ans=0;
    b[0]=0;
    for(int i=1;i<=n;++i){
        if(b[i]!=b[i-1]) ++ans;
    }
    cout<<ans<<endl;
}
int main(){
    cin>>t;
    while(t--){
        solve();
    }
    return 0;
}

K

对于任意的起始页x,可以变成要么是偶数,要么是奇数

所以为了满足2*x+1=y

  • 当x是奇数,y一定是奇数
  • 当x是偶数,y一定是奇数

根据讨论,y是偶数一定不成立

点击查看代码
#include<bits/stdc++.h>

using namespace std;
int n;
int t;
const int maxn=1e5+10;
int b[maxn];
map<int,int>mp;
void solve(){
    int x,y;
    cin>>x>>y;
    x%=2;
    if(y%2){
        if(((y-1)/2)%2==x) puts("YES");
        else puts("NO");
    }
    else {
        puts("NO");
        
    }
    return ;
}
int main(){
    cin>>t;
    while(t--){
        solve();
    }
    return 0;
}

L

唉,思路完全正确,但是赛时写的依托答辩

首先,我们要满足删除后,CHICKEN的相对顺序存在,否则不可能

其次,我们需要删去的数目n-7必须是偶数,否则,抵消后总会剩下一个

又因为必须选择的是不同的数,所以,删去的某个字母必须是小于n-7的一半,不然这个超过一半的字母一定会剩下

其次,

点击查看代码
#include <bits/stdc++.h>
 
using namespace std;
 
int n;
int t;
const int maxn = 1e5 + 10;
int b[maxn];
map<char, int> mp;
string s;
void solve() {
    cin>>n;
    mp.clear(); 
    cin>>s;
    s=" "+s;
    for(int i=1;i<= n;++i) {
        mp[s[i]]++;
    }
    if((n-7) % 2 != 0||n<7) {
        puts("NO");
        return;
    }
    string h="CHICKEN";
    for (int i=0;i<7;++i) {
        char c=h[i];
        mp[c]--;
        if(mp[c]<0) {
            puts("NO");
            return;
        }
    }
    for (int i=0,j=1;i<7;++i) {
        char c=h[i];
        bool found=false;
        for (;j<=n;++j) {
            if (s[j]==c) {
                found=true;
                j++;
                break;
            }
        }
        if(!found){
            puts("NO");
            return;
        }
    }
    int sum=0,maxx=0,cnt=0; 
    for (auto [x,y]: mp) {
        if(y==0) continue;
        sum+=y;cnt++;
        maxx=max(maxx,y);
    }
    if(cnt==0) {
        puts("YES");
        return;
    }
    if(cnt==1 ||sum%2!=0) {
        puts("NO");
        return;
    }
 
    sum/=2;
    if(maxx>sum) {
        puts("NO");
    }
	else {
        puts("YES");
    }
}
 
int main() {
    cin >> t;
    while (t--) {
        solve();
    }
    return 0;
}

C

  • 打表规律题

    区间内和sum=i=lrai=al+ar2(rl+1)=(rl1)(rl+1)

    打表之后,你会发现sum总是偶数,而且不是2的幂次方,除了2

  • discussion

如果不除去考虑2的幂次方,那么第k大的数,一定是2*k

对于每一个数,他一定处于(2i,2i+1)之间,

所以第k大的数一定满足 (k+i)2<2i+1

因此枚举找i就行

点击查看代码
#include<bits/stdc++.h>

using namespace std;
int n;
#define ll long long
int t;
const int maxn=1e5+10;
int b[maxn];
map<char,int>mp;
string s;
int a[maxn];
ll k;
ll quick_pow(int a,int b){
    ll base=a;
    ll ans=1;
    while(b){
        if(b&1) ans*=base; 
        base*=base;
        b>>=1;
    }
    return ans;
}
void solve(){
    cin>>k;
    for(ll i=0;;++i){
        if(quick_pow(2,i+1)>k+i){
            cout<<(i+k)*2<<endl;
            return ;
        }
    }
}
int main(){
    cin>>t;
    while(t--){
        solve();
    }
    return 0;
}

本文作者:归游

本文链接:https://www.cnblogs.com/guiyou/p/18713710

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   归游  阅读(3)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起