今天和羽哥老汪进行了长沙赛前的最后一场个人赛,还差星期五的一场团体赛,加油吧!少年
直接进行暴力枚举,自己先把所有的情况都算出来,再进行二分查找。记录所有的数据。
时间为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;
}

在长沙赛前的个人赛中,通过暴力枚举与二分查找解决复杂问题,同时羽哥展示了高效的算法优化技巧。文章详细介绍了算法实现步骤及性能优化方法。

被折叠的 条评论
为什么被折叠?



