zoukankan      html  css  js  c++  java
  • hdu1030 Deltawave (数学题,找规律)

    纯数学题,找规律Orz

    看了网上的解题报告,稍微有点懂了

    首先就是找出m和n各自所在的层数,并求出俩层的差cc,这个好办

    接下来求出m(比较小的那个)所在三角往下的辐射边界,简单的说,就是m所在三角往左下角和右下角的延伸后,在n所在层的边界

    再来,就是判断n是在边界内还是边界外,若是边界外,则是n与边界距离+2*cc;

    若在边界内,则需判断n与m所在三角形是否同为正或同为倒,若同正同倒,则直接等于2*cc,若不同,则需判断m是正还是倒,若m为正,则为2*cc-1;若m为倒,则为2*cc+1;

    结合图片比较好理解http://acm.hdu.edu.cn/showproblem.php?pid=1030

    看代码吧,解释的比较清楚

    #include <stdio.h>
    #include<math.h>
    int main()
    {
    int temp,n,m,s,flag=3,cn,cm,zb,yb,cc,k,sj;
    while(scanf("%d%d",&m,&n)==2 )
    {   flag=3;s=0;k=0;
      if(m>n)   { temp=m;m=n; n=temp;}
      cn=(int)ceil(sqrt((double)n));//判断n和m所在层数
      cm=(int)ceil(sqrt((double)m));
          cc=abs(cn-cm);//判断两点层差
          zb=m+(cn-1)*(cn-1)-(cm-1)*(cm-1);//判断m辐射到n层所及范围的左边界和右边界
      yb=zb+2*cc;
    
          if(n>=zb && n <=yb) //判断n在m范围所须步数
          {s=2*(cc);k=1;}
          else
          {       if(n<zb) //判断n到m边界及m点所须步数和
                      s=2*(cc)+abs(n-zb); 
              else
              s=2*(cc)+abs(n-yb);
          }
      sj=m-(cm-1)*(cm-1);//判断三角类型0正,1倒
      if(abs(n-m)% 2 !=(cc) % 2)//不 同时为正三角或倒三角时,判断m所在为正三角还是倒三角
      {
          if(sj % 2 ==1 )//正三角
          flag=1;
          else
          flag=0;
      
      }
      if(flag==1 && k==1) s=s-1;//假如n点在m点辐射范围内,正三角-1,倒三角+1,不在不判断.
      if(flag==0 && k==1) s=s+1;
            printf("%d\n",s);
    }
    return 0;
    }
    
  • 相关阅读:
    椭圆形 上传图片预览 image preview (未整理版本)
    canvas学习笔记03:简单脉冲效果
    canvas学习笔记02:饼图&柱状图
    canvas学习笔记01:Math.sin & Math.cos
    java jdk 随机数阻塞问题
    家政/保洁 平台设计
    Lock和synchronized
    jvm 中java new 对象顺序
    Java 多线程原理
    java ftp上传下载,下载文件编码设置
  • 原文地址:https://www.cnblogs.com/nanke/p/2120409.html
Copyright © 2011-2022 走看看