牛客小白月赛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; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现