四平方和 —— AcWing 1221

题目链接

解题思路:
  1. 首先可以用暴力(暴力耗时最少),直接三重 for 循环。
  2. 正常解法是二分,首先我们先求出c ,d (a , b也可),然后将符合条件的存入结构体中,进行排序,然后再求出 a , b 然后计算出 t = n - a* a - b * b ,查找结构体中是否存在符合 t 的数,如果存在进行输出。


代码:
#include 
#include 
#include 
#include 
#include 

using namespace std;

const int N = 5000010;

struct solve {
    int a,b,su;
}s[N];

bool cmp(solve x,solve y){
    if (x.su != y.su) return x.su < y.su;
    if (x.a != y.a) return x.a < y.a;
    return x.b < y.b;
}

int main(){
    int n;
    scanf("%d",&n);
    int m = 0;
    for (int i  = 0; i * i <= n; i ++){
        for (int j = i; i * i + j *j <= n; j++){ //首先求出 c ,d 进行存入
            s[m].a = i;
            s[m].b = j;
            s[m].su = i * i + j * j;
            m ++;
        }
    }
    sort(s,s + m, cmp);  // 字典序最小,进行排序
    for (int i = 0; i * i <= n; i++){
        for (int j = i; j * j + i *i <= n; j++){
            int t = n - i * i - j * j;  // 求是否存在符合
            int l = 0; 
            int r = m - 1;
            while(l < r){  // 二分
                int mid = l + r >> 1;
                if (s[mid].su >= t) r = mid;
                else l = mid + 1;
            }
            if (s[l].su == t) {
                printf("%d %d %d %d\n",i,j,s[l].a,s[l].b);
                return 0;
            }
        }
    }
    return 0;
}

你可能感兴趣的:(二分,Acwing)