这是我原本的代码:
#include<bits/stdc++.h>
using namespace std;
long long n,f[100000],num=0;
inline void dfs(long long x){
if(x==0){
cout<<"0";
return ;
}
if(x==2){
cout<<"2";
return ;
}
// cout<<x<<"\n";
long long l=0,r=num+1;
while(l+1<r){
long long mid=(l+r)>>1;
if(f[mid]<=x) l=mid;
else r=mid;
}
if(l==1) cout<<"2";
else{
cout<<"2(";
dfs(l);
cout<<")";
}
if(f[l]<x){
cout<<"+";
dfs(x-f[l]);
}
}
int main(){
f[0]=1;
while(f[num]*2<=20000) f[++num]=f[num-1]*2;
f[++num]=f[num]*2;
cin>>n;
dfs(n);
return 0;
}
然后洛谷给我评了个MLE !
之后改了半天,发现
while(f[num]*2<=20000) f[++num]=f[num-1]*2;
这句话错了,我在其他 OJ 上都是这样写得,也是对的。
改后 AC 代码:
#include<bits/stdc++.h>
using namespace std;
long long n,f[100000],num=0;
inline void dfs(long long x){
if(x==0){
cout<<"0";
return ;
}
if(x==2){
cout<<"2";
return ;
}
// cout<<x<<"\n";
long long l=0,r=num+1;
while(l+1<r){
long long mid=(l+r)>>1;
if(f[mid]<=x) l=mid;
else r=mid;
}
if(l==1) cout<<"2";
else{
cout<<"2(";
dfs(l);
cout<<")";
}
if(f[l]<x){
cout<<"+";
dfs(x-f[l]);
}
}
int main(){
f[0]=1;
while(f[num]*2<=20000){
num++;
f[num]=f[num-1]*2;
}
f[++num]=f[num]*2;
cin>>n;
dfs(n);
return 0;
}
不知道为什么,求教。