2862--勾股定理
来源:互联网 发布:医院预约管理系统php 编辑:程序博客网 时间:2024/05/01 16:01
勾股定理
Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^
题目描述
给N个数,判断这N个数中存在多少组勾股数(勾股数:存在三个数满足a*a + b*b = c*c)。
输入
第一行输入一个数T(1<=T<=50),表示有T组数据。
每组数据输入一个N(1<=N<=1000)。
接下来N个数ai(1<=ai<=10^9)。
输出
每组数据输出一行,表示有多少组勾股数。
示例输入
344 3 5 34 6 7 8 1056 7 8 9 5
示例输出
210
提示
来源
枚举两边,对第三遍做二分查找
示例程序
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <algorithm>
using namespace std;
long long int p[2000] ;
int num[2000] ;
int main()
{
int t , i , j , n , l , ans ;
long long int k ;
scanf("%d", &t);
while(t--)
{
scanf("%d", &n);
for(i = 0 ; i < n ; i++)
{
scanf("%lld", &p[i]);
p[i] *= p[i] ;
}
sort(p,p+n);
/*for(i = 0 ; i < n ; i++)
printf("%lld ", p[i]);
printf("\n");*/
memset(num,0,sizeof(num));
k = -1 ;
l = 0 ;
for(i = 0 ; i < n ; i++)
{
if(p[i] != k)
{
num[i] = 1 ;
l = i ;
k = p[i] ;
}
else
num[l]++ ;
}
k = -1 ;
for(i = 0 ; i < n ; i++)
if(num[i] == 0)
num[i] = k ;
else
k = num[i] ;
/*for(i = 0 ; i < n ; i++)
printf("%d ", num[i]);
printf("\n");*/
ans = 0 ;
for(i = 0 ; i < n ; i++)
{
for(j = i+1 ; j < n ; j++)
{
k = p[i]+ p[j] ;
int low = 0 , mid , high = n-1 ;
while(low <= high)
{
mid = (low + high) / 2 ;
if( p[mid] == k )
break;
else if( p[mid] < k )
low = mid + 1 ;
else
high = mid - 1 ;
}
if(p[mid] == k)
ans++ ;
}
}
printf("%d\n", ans);
}
}
#include <string.h>
#include <math.h>
#include <algorithm>
using namespace std;
long long int p[2000] ;
int num[2000] ;
int main()
{
int t , i , j , n , l , ans ;
long long int k ;
scanf("%d", &t);
while(t--)
{
scanf("%d", &n);
for(i = 0 ; i < n ; i++)
{
scanf("%lld", &p[i]);
p[i] *= p[i] ;
}
sort(p,p+n);
/*for(i = 0 ; i < n ; i++)
printf("%lld ", p[i]);
printf("\n");*/
memset(num,0,sizeof(num));
k = -1 ;
l = 0 ;
for(i = 0 ; i < n ; i++)
{
if(p[i] != k)
{
num[i] = 1 ;
l = i ;
k = p[i] ;
}
else
num[l]++ ;
}
k = -1 ;
for(i = 0 ; i < n ; i++)
if(num[i] == 0)
num[i] = k ;
else
k = num[i] ;
/*for(i = 0 ; i < n ; i++)
printf("%d ", num[i]);
printf("\n");*/
ans = 0 ;
for(i = 0 ; i < n ; i++)
{
for(j = i+1 ; j < n ; j++)
{
k = p[i]+ p[j] ;
int low = 0 , mid , high = n-1 ;
while(low <= high)
{
mid = (low + high) / 2 ;
if( p[mid] == k )
break;
else if( p[mid] < k )
low = mid + 1 ;
else
high = mid - 1 ;
}
if(p[mid] == k)
ans++ ;
}
}
printf("%d\n", ans);
}
}
0 0
- 2862--勾股定理
- SDUT OJ 2862 勾股定理
- SDUT-2862 勾股定理
- 勾股定理
- 勾股定理
- 勾股定理
- 勾股定理
- 勾股定理
- 勾股定理
- 勾股定理
- 勾股定理
- 勾股定理
- 勾股定理
- 勾股定理
- 勾股定理
- 勾股定理
- 勾股定理
- 勾股定理
- No grammar constraints (DTD or XML schema)
- 动态表单实现客户端二次过滤及字段汇总统计
- UVa live3415Guardian of Decency(二分最大匹配之最大独立点集)
- Java8新特性——可重复注解
- Android常见的错误及解决
- 2862--勾股定理
- java实现Img与PDF相互转换
- memset()函数的应用
- A*算法(转)
- SWF 文件不能访问本地资源
- 利用Robot Framework和Python wrapper of Android uiautomator的Android测试自动化
- Windows应用程序高级控件之ImageList
- 算法导论堆排序java实现
- VS2010 无法打开包括文件:“iostream.h”: No such file or directory