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.
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ả:
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