牛客小白月赛51-C-E

C-零一题

题意: 每次可以选择两个相邻且相同的字符,将他们删除,在无数次操作后,字符串的长度变为n,问能否构造出原来的字符串,不能输出-1

题解: 很明显,最后无法再操作时,这个字符串一定是01相交的,由于n是偶数,所以最后一定是0 1各n/2个,然后判断在原有的基础上减去这些,判断0 1的个数符不符合条件,符合就输出,不符合-1

代码: 

复制代码
#include<iostream>
#include<algorithm>
#include<map>
#include<string>
#include<vector>
using namespace std;
typedef long long ll;
typedef pair<ll,ll> pll;
const int N=1e5+10;
const ll mod=1e9+7;
signed main(){
  ios::sync_with_stdio(false);
  cin.tie(0);
  ll p,q,m;cin>>p>>q>>m;
  ll l=p-m/2;
  ll r=q-m/2;
  if(l<0||l%2==1||r<0||r%2==1){//不能为奇数,奇数就不能删完
    cout<<"-1";return 0;
  }
  ll n=m/2;
  while(n--){
    cout<<"10";
  }
  while(l--) cout<<"0";
  while(r--) cout<<"1";
}
复制代码

 

D-操作题

题意: 开始有两个数 a=0,b=1, 每次可以进行四种操作,问能否在400次操作内让 a或b等于 n

题解: 进制分解,每次判断当前能否被k整除,即判断能否有高一幂的需求,比如8/2=4,4%2=0,所以最后可以直接加上8,6/2=3,3%2=1,证明这一位要直接加上,所以就是先加2再加4,这样不断分解即可。

复制代码
#include<iostream>
#include<algorithm>
#include<map>
#include<string>
#include<vector>
using namespace std;
typedef long long ll;
typedef pair<ll,ll> pll;
const int N=1e5+10;
const ll mod=1e9+7;
vector<pair<ll,char>> q;
signed main(){
  ios::sync_with_stdio(false);
  cin.tie(0);
  ll t;cin>>t;
  while(t--){
    ll n,m;cin>>n>>m;
    q.clear();
    while(n){
       ll y=n%m;//加上所需要的值
       while(y--){
         q.push_back({1,'a'});
       }
       n/=m;
       if(n){
         q.push_back({2,'b'});
       }
    }
    cout<<q.size()<<endl;
    for(ll i=0;i<q.size();i++){
      cout<<q[i].first<<" "<<q[i].second<<endl;
    }
  }
}
复制代码

 

E-语法题

题意: 给出一个n,根据以上if语句,判断原来的n有几种可能

题解: 首先a一定是不断递增的,然后如果最大的a也没有n大,n就不会进行任何一个if语句的判断,就会直接输出,否则他的取值区间应该为[n*a,b*(n+1)-1],注意每次左区间一定要比上次的a大,并且题目要求是正整数,所以也要大于等于1。 并且,这个题目的数据比较大,n最大可以达到1e18,很容易就超long long ,但很明显,如果n>1e9,就肯定比a大,但这种情况可以和比所有a大这种情况合并,因为>1e9肯定也比所有a大,判断一次即可。

代码:

复制代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<ll,ll> pll;
const int N=2e5+10;
const ll mod=1e9+7;
vector<pll> p,q;
ll n,t,ans;
signed main(){
  ios::sync_with_stdio(false);
  cin.tie(0);
  cin>>t;
  for(ll i=1;i<=t;i++){
    ll x,y;cin>>x>>y;
    if(i==1||x>q.back().first) q.push_back({x,y});
  }
  cin>>n;
  if(n>=q.back().first)
    {
        cout<<"1";
        return 0;
    }
  for(ll i=0;i<q.size();i++){
    if(n>=q[i].first) continue;
    ll l=max(1ll,n*q[i].second);
    ll r=min(q[i].first-1,q[i].second*(n+1)-1);
    if(i) l=max(q[i-1].first,l);
    ans+=max(r-l+1,0ll);
  }
  cout<<ans;
}
复制代码

 

posted @   HHzp  阅读(61)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示