这道题有坑啊!注意题目没有说最大多少位,可能会很大,所以搜索的时候不能用顺序搜索
因为是有顺序的,明显是用二分搜索!
一开始顺序搜索能拿22分:
//1010
/*
6 110 1 10
1 ab 1 2
*/
#include <iostream>
#include <cmath>
using namespace std;
typedef long long ll;
int change(char x[],ll d){//将d进制的数x转换成十进制
int i=0;
while(x[i]!='\0'){
i++;
}
int r=0;
for(int j=i-1;j>=0;j--){
if(x[j]<='z'&&x[j]>='a'){
r+=((x[j]-'a'+10)*pow(d,i-j-1));
}else{
r+=((x[j]-'0')*pow(d,i-j-1));
}
}
return r;
}
int main(){
cout<<(1<<31);
char x[100]={0},y[100]={0};
ll tag,radix;
cin>>x>>y>>tag>>radix;
int x1,y1;
bool flag = false;
// cout<<change(y,10)<<endl;
if(tag==1){
x1 = change(x,radix);
for(int i=1;i<=10000;i++){
if(change(y,i)==x1){
cout<<i<<endl;
flag = true;
break;
}
}
}else{
y1 = change(y,radix);
for(int i=1;i<=10000;i++){
if(change(x,i)==y1){
cout<<i<<endl;
flag=true;
break;
}
}
}
if(!flag){
cout<<"Impossible"<<endl;
}
return 0;
}
提示是答案错误,不是超时;感觉不像是没用二分的二分的问题
看网上其他人的,我还是用二分重写了一下:
//1010二分
/*
6 110 1 10
1 ab 1 2
*/
#include <iostream>
#include <vector>
#include <cmath>
using namespace std;
typedef unsigned long long ll;
static const ll MAX = (1000);
ll change(char x[],ll d){//将d进制的数x转换成十进制
int i=0;
while(x[i]!='\0'){
i++;
}
ll r=0;
for(int j=i-1;j>=0;j--){
if(x[j]<='z'&&x[j]>='a'){
r+=((x[j]-'a'+10)*pow(d,i-j-1));
}else{
r+=((x[j]-'0')*pow(d,i-j-1));
}
}
return r;
}
ll find(ll a,char x[]){//二分查找,如果不存在则返回-1
ll left = 0;
ll right = a+1;
ll mid;
while(left<=right){
mid = (left+right)/2;
if(a==change(x,mid))
return mid;
else if(a>change(x,mid)){//搜索后半部分
left = mid+1;
}else{//搜索前半部分
right = mid-1;
}
}
return -1;
}
int main(){
char x[MAX]={0},y[MAX]={0};
ll tag,radix;
cin>>x>>y>>tag>>radix;
ll x1,y1;
if(tag==1){
x1 = change(x,radix);
if(find(x1,y)==-1){
cout<<"Impossible"<<endl;
}else{
cout<<find(x1,y)<<endl;
}
}else{
y1 = change(y,radix);
if(find(y1,x)==-1){
cout<<"Impossible"<<endl;
}else{
cout<<find(y1,x)<<endl;
}
}
return 0;
}
结果拿到的分更少了
我去牛客上看一下测试点:
最大的28031959,窝里个去……
写这么大又会内存超限,换unsigned long long 都不行
服了
先睡觉去了,明天再看。。