Hướng dẫn giải của Sum of cubes


Chỉ dùng lời giải này khi không có ý tưởng, và đừng copy-paste code từ lời giải này. Hãy tôn trọng người ra đề và người viết lời giải.
Nộp một lời giải chính thức trước khi tự giải là một hành động có thể bị ban.

Tác giả: tranxuantruong

Bài này có nhiều cách làm

Cách một: Chắc ok nhưng chậm

Tạo ra 1 mảng là a^3 và b^3, rồi ta có độ lớn của mảng là pow(1e12, 1/3.0)=1e4. Nói chung là khá nhỏ. Rồi dùng map, set... kiểm tra xem có thểm dùng 2 phần tử để tạo thành số muốn tìm không

Cách hai: dùng thêm tìm kiếm nhị phân - code sẽ chạy ok -- Gợi ý thế thôi, còn lại tự làm nha

Code 1: duyệt trâu vì input khá nha - độ phức tập 100*1e4=1e6

int main() {
   ios_base::sync_with_stdio (0); cin.tie (0);

   #define trying_to_make_a_lot_of_mistakes_when_allowed
   #define trying_to_read_a_lot_of_editorials_when_allowed
   #define int long long


   int t; cin >> t;

   for(int i=0; i<t; ++i){
      int n; cin >> n;

      int check=false;
      for(int i=1; i<=1e4; ++i){
         int x=n-pow(i, 3);

         if(x>0){
            x=pow(x, 1.0/3); // pow(x, 1.0/3) có nghĩa là tính x mũ 1/3 (dạng phân số), tức là căn bậc 3 của x
            // Nhưng lưu ý là 1.0 chia 3 thì không chia hết
            // Và làm việc với số thực, máy tính sẽ làm tròn số ở một mức độ nào đó, và kết quả không thể đúng 100%, nên nó có thể sai số tầm 1e-9 (-9 là là 0 phẩy chín số 0, rồi số 1 tiếp theo: 0,0000000001). Ý muốn nói là có sai số vì thế phải kiểm tra các trường hợp làm tròn 


            if(pow(x, 3)+pow(i, 3)==n || pow(x+1, 3)+pow(i, 3)==n){
               check=true;
               break;
            }
         }
         else{
            break;
         }
      }

      if(check){
         cout <<"YES" <<endl;
      }
      else{
         cout <<"NO" <<endl;
      }
   }














   return 0;
}

Code 2: nhìn như kiểu 2 con trỏ, và độ phức tạp là: 100*1e4

int main() {
    ios_base::sync_with_stdio(0); cin.tie(0);

    #define int long long

    int t; cin >> t;
    for(int i=0; i<t; ++i) {
      int x; cin >> x; 

        int l=1, r=1e4;
        bool check = false;
        while(l<=r) {
            ll temp=l*l*l+r*r*r;
            if(temp==x) {
                check=true;
                break;
            }
            else if(temp<x) {
                l+=1;
            }
            else {
                r-=1;
            }
        }
        if(check==false) {
            cout <<"NO" <<endl;
        }
        else {
            cout <<"YES" <<endl;
        }
    }

    return 0;
}

Code 3: nhìn như tìm kiếm nhị phân (nhưng tìm kiếm nhị phân chỉ để check đáp án thôi) nên độ phức tạp vẫn là O(100 * 1e4 * log(...) \~ 1e6 * log(...) \~ 1e7)

int main() {
   ios_base::sync_with_stdio (0); cin.tie (0);

   #define int long long


   // initialization
   vector <int> a(10001);
   for(int i=0; i<10001; ++i){
      a[i]=i*i*i;
   }


   int t; cin >> t;

   for(int i=0; i<t; ++i){
      int sum; cin >> sum;

      bool check=false;

      for(int i=1; i<10000; ++i){
         int want=sum-a[i];

         if(want<a[i]){
            break;
         }

         int left=i;
         int right=10000;
         for( ;left<=right; ){
            int mid=left+right>>1;

            if(a[mid]>=want){
               right=mid-1;
            }
            else{
               left=mid+1;
            }
         }

         check|=a[left]==want;

         if(check){
            break;
         }


      }

      if(check){
         cout <<"YES" <<endl;
      }
      else{
         cout <<"NO" <<endl;
      }
   }











   return 0;
}

Bình luận

Hãy đọc nội quy trước khi bình luận.


Không có bình luận tại thời điểm này.