Four square and - Seventh blue bridge Provincial Cup tournament C ++ A / B group

Title Description
Here Insert Picture Description

AC Code

/*
解法1:
暴力枚举,枚举每一个数字,但是,这样子即便优化后,三重循环,仍然会超时!不可选!

解法2:
利用空间去换时间
开始的时候,为了方便,直接开辟出五百万的int类型空间,反正空间大,不怂

然后计算出a,b这两个数字的平方和,并记录下,数组下标是这两数字的平方和,数组里面的
值是b这个数字的值!

然后计算c,d,此时,计算出c的平方和d的平方,如果有对应a的平方和c的平方,可以组成
n的和,即是解!排序输出即可!因为是从0开始的,前面的计算a平方+b平方,也只计算字典序
小的一组,所以,直接排序输出即可! 
  
*/


#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <math.h>

using namespace std;


int nums[5000000];
int N;
int main()
{
	cin >> N;
	memset(nums,0xff,5000000*sizeof(int));//数组每一个数字置-1 
	
	for(int i = 0; i*i <= N; ++i)
	{
		for(int j = i; i*i+j*j <= N; ++j)
		{
			if(nums[i*i+j*j] == -1)//如果不是-1,则代表前面已经有过了,不存入! 
				nums[i*i+j*j] = j;
		}
	}
	
	//推算 c,d的值! 
	for(int i = 0; i*i <= N; ++i)
	{
		for(int j = i; i*i + j*j <= N; ++j)
		{
			if(nums[N - i*i - j*j] != -1)
			{
				int k = nums[N-i*i-j*j];
				int m = sqrt(N-i*i-j*j-k*k);
				
				//其实这里j >= i;k >=m ,但是为了方便,直接放在数组里,用排序,损耗时间可忽略不计 
				int result[4]; 
				result[0] = i;
				result[1] = j;
				result[2] = k;
				result[3] = m; 
				
				sort(result, result+4);
				
				for(int u = 0; u < 4; u++)
				{
					cout << result[u] <<" ";
				}
				
				return 0;
			}
		}
	}
	
	return 0;
} 
Published 40 original articles · won praise 50 · views 4699

Guess you like

Origin blog.csdn.net/qq_43800455/article/details/105328948
Recommended