不对,思路好像不同,再见
1 个赞
i*i*i>n就可以不再往下了
正确的
1 个赞
我猜AC了
1 个赞
@刘子睿 AC了吗??
WA,包WA的
1 个赞
WA(你猜的真准)
1 个赞
1 个赞
窝无法理解你的代码,所以我走了
1 个赞
主要看二分
1 个赞
至少TLE解决了
WA其实挺简单的
就是先枚举第一个边长,然后二分第二个边长
1 个赞
@王天皓 啊对
1 个赞
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll a[200005],a1[200005], idx; ll n, m;
bool check(ll x){
if(x*x*x>=m) return 1;
else return 0;
}
int main(){
ll t;
cin >> t;
while(t--){
cin >> n;
ll b=1;
for(ll i=1;i*i*i<=n;i++){
m=n-i*i*i;
ll l=0;
ll r=m;
ll mid;
while(r>l){
mid=(l+r)/2;
if(check(mid)){
l=mid+1;
}
else{
r=mid;
}
}
if(r==0) b=0;
}
if(b) cout << "YES" << endl;
else cout<<"NO" << endl;
}
}
1 个赞
这句话啥意思?
1 个赞
我是
1 个赞
其实你不同二分也可以
因为时间复杂度(再不用二分的情况下)最坏是O(10^5)
for (ll a = 1; a * a * a <= x; a++)
{
ll tmp = x - a * a * a;
ll b;
if (check(tmp, b)
{
if (b >= 1)
{
flag = true;
break;
}
}
}
改成这样子