您的位置:首页 > 其它

poj1840 - Eqs

2013-08-22 10:01 316 查看
题目大意:给出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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: