本文主要是介绍牛客集训营第三题 G,严肃古板的秩序,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
题目:
分析题目:首先由#运算及阿拉伯数字的数量级,我们很容易想到快速幂的板子,所以直接拿过来就可(注意取模板子的位置)然后我们就可遍历整个字符串,细节处理将等号前面的阿拉伯数字依次压入一个容器中,等号后面的阿拉伯数字赋值给ans作为答案输出比较,具体代码实现及注释下面演示
代码演示:
#include<bits/stdc++.h>
typedef long long ll;
typedef double db;
using namespace std;
ll ans;
vector<ll>v;
int b[202]; //存取所需要的具体符号,其中0代表+,1代表-,2代表#
ll power(ll a,ll b,ll mod){ //去模快速幂板子 ll res=1;a %= mod; //过全部数据必须加上此代码,防止下方res*a越界 while(b){if(b&1) res=res*a%mod;b>>=1;a=a*a%mod;}return res;
}
int main(){string s;cin>>s;int i,temp=0,j;for(i=0;i<s.length();i++){if(s[i]=='?'||s[i]=='=') v.push_back(temp),temp=0; //将等号前面的数字依次压入一个容器中 else temp*=10,temp+=s[i]-'0'; //将字符串每一位的字符转化为int类型,最后通过累乘10变为整数 }ans=temp;while(!b[v.size()]){ //所需数字的个数始终比所需符号个数多一 ll temp=v[0];for(j=1;j<v.size();j++){if(b[j]==0) temp=temp+v[j];if(b[j]==1) temp=temp-v[j];if(b[j]==2){if(temp<=0){ //题目保证底数为正整数,若不满足条件输出-1,跳出重新选取符号 temp=-1;break;}temp=power(temp,temp,v[j]);}}if(temp==ans){ //找到该循环所涉及的符号满足等于ans,输出结果 cout<<v[0];for(j=1;j<v.size();j++){if(b[j]==0) cout<<'+';if(b[j]==1) cout<<'-';if(b[j]==2) cout<<'#';cout<<v[j];}cout<<"="<<ans;break;}b[1]++; //此代码的精髓,可以获取所有符号位关于012的组合,从00...遍历至222...最后一个组合遍历完之后使得b[v.size()]不为0结束符号循环 for(j=1;j<v.size();j++){b[j+1]+=b[j]/3; b[j]%=3; //保证b[j]对3取模,结果之可能在0,1,2 }}if(b[v.size()]) cout<<-1;//所有组合遍历完都未找到结果等于ans,输出-1
}
这篇关于牛客集训营第三题 G,严肃古板的秩序的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!