poj1840 - Eqs

题目大意:给出5个参数a1到a5,然后解出一个方程a1x1^3+ a2x2^3+ a3x3^3+ a4x4^3+ a5x5^3=0 ,使得解出5个解(x1, x2, x3, x4, x5),然后问你有多少组不同的解,然后xi和ai的范围都是,[-50,50],且不等于0
解题思路:
首先如果用暴力算法,将每个x从-50到50循环,然后判断是否等于0,然后100^5,运算1000W次,
超时。


然后试着来降低运算复杂度,是不是可以减少次方。
将方程进行变形为-(a1x1^3+ a2x2^3) = a3x3^3+ a4x4^3+ a5x5^3
这样最大运算为100^3,运算10W次
这样比较左右方程式的和是否相等就可以了


当然,判断相等也要开一个数组保存下来,比如 1*3+2*1 和 1*1 + 2 * 2是相等的,但是却是两

种解。所以记录下结果等于5的次数为多少,开一个数组hash[],这个时候记录下hash[5]=2
数组最大开(50 * 50^3 + 50* 50^3)*2 = 25000000,要考虑负数
我们令12500000为0
这样就可以求出多少个解了
最后开hash数组的时候不用short会超内存

#include <iostream>
using namespace std;
#define MAXV 25000000
int x1,x2,x3,x4,x5;

short int hash[MAXV + 1];			//hash数组

int main(){
	int a,b,c,d,e;
	int sum ,ans;

	while(cin>>a>>b>>c>>d>>e){
		memset(hash,0,sizeof(hash));		//初始化

		for(x1 = -50;x1 <= 50;x1++){			//算左边一个范围的解
			if(x1 == 0) continue;
			for(x2 = -50;x2 <= 50;x2++){
				if(x2 == 0) continue;
				
				sum = -(x1*x1*x1*a + x2*x2*x2*b);
				sum += MAXV/2;			//将负数变换为负数
				hash[sum]++;			//结果累加
			}
		}

		ans = 0;

		for(x3 = -50;x3 <= 50;x3++){
			if(x3 == 0) continue;
			for(x4 = -50;x4 <= 50;x4++){
				if(x4 == 0) continue;
				
				for(x5 = -50;x5 <= 50;x5++){
					if(x5 == 0) continue;

					sum = x3*x3*x3*c + x4*x4*x4*d + x5*x5*x5*e;
					sum += MAXV/2;			//将负数变换为负数
					if(sum < 0 || sum >= MAXV) continue;		//如果超过左边的结果的范围则不计算

					if(hash[sum]){
						ans+=hash[sum];		//解的累加
					}
				}
			}
		}

		cout<<ans<<endl;
	}
	return 0;
}

你可能感兴趣的:(poj1840 - Eqs)