• ACM题解报告——HD1496


      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
  • 相关阅读:
    vue苦逼自学之路
    第一次博客作业
    u3d学习资料
    leetcode——Divide Two Integers
    leetcode——Swap Nodes in Pairs
    leetcode——Merge k Sorted Lists
    leetcode——Container With Most Water
    leetcode——Regular Expression Matching
    leetcode——Longest Palindromic Substring
    CC_CALLBACK之间的区别
  • 原文地址:https://www.cnblogs.com/paradises/p/3103857.html
Copyright © 2020-2023  润新知