您的位置:首页 > 其它

ACM题解报告——HD1496

2013-05-28 16:17 519 查看
hdoj上的1496题,题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1496

此题的大意就是让你找出四元方程式a*x1^2+b*x2^2+c*x3^2+d*x4^2=0的解的种数并输出,其中a,b,c,d为常量,最开始的时候输入,他们的范围是[-50,0)&&(0,50],而变量x1、x2、x3、x4的范围是[-100,0)&&(0,100]。

开始看到这道题我的思路就是进行暴力搜索,当时觉得应该会超时,后来果然超时了,没办法,只能想其它方式了。

我们可以变化一下方程,写成a*x1^2+b*x2^2=-(c*x3^2+d*x4^2)。这样子的话我们就可以两边都进行搜索,最后找出相等的解即可。我使用了map数组下标来保存左边的结果,观察一下,发现当a、b、x1、x2都分别取最大或最小值时,map下标的变化范围是[-1000000,0)&&(0,1000000],为了保证map下标不小于0,可以选择在等式两边加上1000000,此时方程式变成了a*x1^2+b*x2^2+1000000=1000000-(c*x3^2+d*x4^2),最后用了一个sum值来统计他们的结果相同的个数。

代码如下:

#include<iostream>
using namespace std;
int map[2000008];
int ans,i,j,a,b,c,d,sum;
int main( )
{
while(cin>>a>>b>>c>>d)
{
if((a>0&&b>0&&c>0&&d>0)||( a<0&&b<0&&c<0&&d<0))
{
cout<<"0"<<endl;
continue;
}
sum=0;
memset(map,0,sizeof( map));
for(i=1;i<=100;i++)
for(j=1;j<=100;j++)
{
ans=a*i*i+b*j*j+1000000;
map[ans]++;
}
for(i=1;i<=100;i++)
for( j=1;j<=100;j++)
{
ans=c*i*i+d*j*j;
ans=1000000-ans;
sum+=map[ans];
}
cout<<sum*16<<endl;

}
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: