codeforces 183(div2) A. Pythagorean Theorem II 枚举+二分查找

今天和羽哥老汪进行了长沙赛前的最后一场个人赛,还差星期五的一场团体赛,加油吧!少年

题目链接

直接进行暴力枚举,自己先把所有的情况都算出来,再进行二分查找。记录所有的数据。

时间为n*n*lgn

羽哥直接进行的是(a*a+b*b)-ceil(a*a+b*b)来判断是否是小于 eps (eps=1e-10)

post code:

/*************************************************************************
    > File Name: b.cpp
    > Author: yangshuo
    > Created Time: 2013年05月22日 星期三 20时07分37秒
 ************************************************************************/

#include<iostream>
#include<stdio.h>
#include<cmath>
#include<algorithm>
#include<string.h>
using namespace std;
int a[12000];
int rec[12000];
void init(){
    int i;
    for(i=1;i<=10010;i++)
        a[i]=i*i;
}
int search(int num){  //二分查找对应的值
  int left=0,right=10000;
  while(left+1<right){
     int mid=(left+right)/2;
     if(a[mid]>num) right=mid;
     if(a[mid]==num)return 1;
     if(a[mid]<num) left=mid;
  }
  if(a[left]!=num)return 0;
  else return 1;
}
int main()
{
    int max=10001,sum;
    init();
    sum=0;
    for(int i=max;i>=5;i--){ //最长边  直角所对应的边
        sum=0;
        for(int j=i-1;j>=4;j--){
                int k=a[i]-a[j];
                if(k>a[i])break;
                if(k>a[j])break;
                if( search(k)==1 )sum++;
        }
        rec[i]=sum;
        //printf("i=%d sum=%d\n",i,sum);
    }
    for(int i=2;i<=10001;i++){   //累计rec的值 保存最后生成的答案
       rec[i]+=rec[i-1];
       //printf("i=%d rec=%d\n",i,rec[i]);
    }
    while(scanf("%d",&max)!=EOF){
        printf("%d\n",rec[max]);
    }

    return 0;
}



你可能感兴趣的:(算法)