zoukankan      html  css  js  c++  java
  • hdu 1496

    地址:http://acm.hdu.edu.cn/showproblem.php?pid=1496

    题意:给a,b,c,d。计算有多少组(x1,x2,x3,x4)满足方程。

    mark:这其实是poj1840的Eqs简化成的问题,是一个经典的hash问题,但是poj是对内存限制严格,此题则是对时间卡的更紧,TLE了好多次。

    首先将等式分成两边,写成a*x1^2+b*x2^2 = - c*x3^2-d*x4^2,然后枚举其中一边的所有值存起来(hash存),再枚举另一边求解。

    懒得写hash,直接开200w的数组不是不行,但是很容易TLE。千万不能用O(n)的方式清零数组,应该再执行一次存数时的枚举,原来是++后面就用--来平衡。

    后来发现,加一个优化判断a,b,c,d四数同号的时候直接输出0,会快很多!!!

    代码:

     1 # include <stdio.h>
     2 
     3 
     4 # define OFFSET 1000001
     5 
     6 
     7 int val[2000010] ;
     8 
     9 
    10 int main ()
    11 {
    12     int a, b, c, d ;
    13     int x1, x2, ans ;
    14     while (~scanf ("%d%d%d%d", &a, &b, &c, &d))
    15     {
    16     //    memset (val, 0, sizeof(val)) ;
    17         for (x1 =1 ; x1 <= 100 ; x1++)
    18             for (x2 = 1 ; x2 <= 100 ; x2++)
    19                 val[a*x1*x1+b*x2*x2+OFFSET]++ ;
    20         ans = 0 ;
    21         for (x1 = 1 ; x1 <= 100 ; x1++)
    22             for (x2 = 1 ; x2 <= 100 ; x2++)
    23                 ans += val[-c*x1*x1-d*x2*x2+OFFSET] ;
    24                 
    25                 
    26         for (x1 =1 ; x1 <= 100 ; x1++)
    27             for (x2 = 1 ; x2 <= 100 ; x2++)
    28                 val[a*x1*x1+b*x2*x2+OFFSET]-- ;
    29         printf ("%d\n", ans*16) ;
    30     }
    31     return 0 ;
    32 }
  • 相关阅读:
    求解答可用性测试记
    Teambition可用性测试记
    海丁网可用性测试记
    go语言的切片
    go语言的数组
    go语言的函数
    go语言的接口
    go语言的结构体
    go语言的flag
    创建二叉树和三种遍历
  • 原文地址:https://www.cnblogs.com/lzsz1212/p/2441686.html
Copyright © 2011-2022 走看看