codeforces 1490 C Soma de cubos (dois pontos)

Tópico

Insira a descrição da imagem aqui

Título

Dê a você um x, pergunte se há x = a 3 + b 3 , envie SIM / NÃO

responda

  1. Observe que o intervalo de dados x é 1e12, então o intervalo de a, b é 1e4, enumere a, e então a dicotomia b, a condição de dicotomia é b 3 = x-a 3
  2. Claro, você também pode fazer isso com ponteiros duplos, apenas continue estreitando o intervalo.

Código 1 (dois pontos)

#include<bits/stdc++.h>

using namespace std;
typedef long long ll;

ll t, x;

int main() {
    
    

    cin >> t;
    while (t--) {
    
    
        cin >> x;
        bool flag = false;
        for (ll i = 1; i <= 10000; i++) {
    
    
            if (i * i * i >= x) break;
            ll res = x - i * i * i;
            ll l = 1, r = 10000;
            while (l < r) {
    
    
                ll mid = (l + r) >> 1;
                if (mid * mid * mid >= res) r=mid;
                else l=mid+1;
            }
            if(l*l*l==res){
    
    
                flag= true;
                break;
            }
        }
        if (flag) cout << "YES" << endl;
        else cout << "NO" << endl;
    }

    return 0;
}

Código 2 (ponteiro duplo)

#include<bits/stdc++.h>

using namespace std;
typedef long long ll;

ll t, x;

int main() {
    
    

    cin >> t;
    while (t--) {
    
    
        cin >> x;
        bool flag = false;
        for (ll i = 1, j = pow(x, 1.0 / 3)+9; i <= j; i++) {
    
    
            while (i*i*i+j*j*j > x && j > 0) j--;
            if (i*i*i+j*j*j == x && j != 0) {
    
    
                flag = true;
                break;
            }
        }
        if (flag) cout << "YES" << endl;
        else cout << "NO" << endl;
    }

    return 0;
}

Acho que você gosta

Origin blog.csdn.net/qq_44791484/article/details/113844514
Recomendado
Clasificación