湖南大学第十四届ACM程序设计大赛 K The Right-angled Triangles

本文主要是介绍湖南大学第十四届ACM程序设计大赛 K The Right-angled Triangles,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

链接:https://ac.nowcoder.com/acm/contest/338/K
来源:牛客网

题目描述

Consider the right-angled triangles with sides of integral length.

Give you the integral length of  the hypotenuse of a right-angled triangle.  Can it construct a right triangle with given hypotenuse c such that the two legs of the triangle are all . integral length?

输入描述:

There are several test cases. The first line contains an integer T(1≤T≤1,000), T is the number of test cases.The following T lines contain T test cases, each line contains one test case. For each test case, there is an integer : c, the length of hypotenuse.(1≤c≤45,000).

输出描述:

For each case, output Yes if it can construct a right triangle with given hypotenuse c and sides of integral length , No otherwise.

示例1

输入

复制

4
5
6
15
13

输出

复制

Yes
No
Yes
Yes

题目大意:

考虑具有整型长度的直角三角形。
给出直角三角形斜边的长度。它能不能构造一个直角三角形,斜边c是已知的,使得三角形的两条边都是整数?

输入描述:
有几个测试用例。第一行包含一个整数T(1≤T≤1000),T是测试用例的数量。
下面的T行包含T个测试用例,每一行包含一个测试用例。对于每个测试用例,都有一个整数:c,斜边的长度。(c 1≤≤45000)。
输出描述:
对于每一种情况,如果它能构造出斜边c和整型长度的直角三角形,则输出Yes,否则输出No。
示例1
输入
4
5
6
15
13
输出
Yes
No
Yes
Yes

分析:

有两种方法:

1。暴力枚举:题目提供的可能测试数据相对较弱,所以可以利用枚举的方法枚举每一个整数进行尝试,但枚举范围要缩小到

i*i<=c/2;c/2以后的数跟之前就重复了,同时如果不缩小范围的话就超时了。

#include<iostream>
#include<cmath>
using namespace std;
int main()
{long long c,n,ans,a,b;cin>>n;//输入测试次数while(n--){ans=0;cin>>c;//输入斜边c=c*c;for(int i=1;i*i<=c/2;i++)//只需要尝试c/2之前的即可,c/2之后的重复{a=sqrt(c-i*i);//求另一个直角边,如果符合条件答案为1直接跳出循环if(a*a==c-i*i){ans=1;break;}}if(ans==1)cout<<"Yes"<<endl;elsecout<<"No"<<endl;}
}

2.这个题很容易想到的一个思路就是暴力枚举。是的,我们给的解题方法也是暴力枚举。但是,直接枚举的复杂度是O(c2),会超时(TLE)。所以我们需要将问题转化一下,使得枚举的复杂度是O(c)。

• 如果三角形三边满足如下关系,则是直角三角形。
• a=m^2-n^2

• b=2mn
• c=m^2+n^2

解释:这是本原勾股数  因为
a^2+b^2
=(m^4 + n^4)- 2×m^2×n^2+(2mn)^2
=(m^2+n^2)^2=c^2 
• 所以如果斜边长度能够表示成2个正整数的平方和,则能使得三边都是正整数。这样枚举的复杂度是O( c)。
• 另外,如果斜边长度是一个合数,其有一个因子能表示为2个正整数的平方和,那么也能使得三边都是正整数。比如c=15,有因
子5=12+22,那么也是可以构成三边全是整数的直角三角形,每边长度乘以3即可。就是( 9, 12, 15)

#include <stdio.h>
#define N 45001
int MK[N]={0},SQ[213];
int i,j,k;
//MK数组标记能否是整数三角形,为0表示不能,非0表示可以, SQ数组记录数的平方值
int main()
{for(i=1;i<213;++i)SQ[i]=i*i;for(i=1;i<213;++i)for(j=i+1;j<213&&(k=SQ[i]+SQ[j])<N;++j)MK[k]=1; //所有能写成2整数平方和的被标记为能for(i=5;i<22501;++i)if(MK[i]==1)for(j=2;(k=j*i)<N;++j)MK[k]=1; //所有含2整数平方和的因子的正整数被标记为能,类似于筛法求素数的思想scanf("%d",&t);while(t--){scanf("%d",&c);printf("%s\n",MK[c]?"Yes":"No");}return 0;
}

 

这篇关于湖南大学第十四届ACM程序设计大赛 K The Right-angled Triangles的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/257288

相关文章

认识、理解、分类——acm之搜索

普通搜索方法有两种:1、广度优先搜索;2、深度优先搜索; 更多搜索方法: 3、双向广度优先搜索; 4、启发式搜索(包括A*算法等); 搜索通常会用到的知识点:状态压缩(位压缩,利用hash思想压缩)。

C语言程序设计(数据类型、运算符与表达式)

一、C的数据类型 C语言提供的数据类型: 二、常量和变量 2.1常量和符号常量 在程序运行过程中,其值不能被改变的量称为常量。 常量区分为不同的类型: 程序中用#define(预处理器指令)命令行定义变量将代表常量,用一个标识符代表一个常量,称为符合常量。 2.2变量 变量代表内存中具有特定属性的一个存储单元,用来存放数据,在程序运行期间,这些值是可以 改变的。 变

C语言程序设计(选择结构程序设计)

一、关系运算符和关系表达式 1.1关系运算符及其优先次序 ①<(小于) ②<=(小于或等于) ③>(大于) ④>=(大于或等于 ) ⑤==(等于) ⑥!=(不等于) 说明: 前4个优先级相同,后2个优先级相同,关系运算符的优先级低于算术运算符,关系运算符的优先级高于赋值运算符 1.2关系表达式 用关系运算符将两个表达式(可以是算术表达式或关系表达式,逻辑表达式,赋值表达式,字符

智能工厂程序设计 之1 智能工厂都本俱的方面(Facet,Aspect和Respect)即智能依赖的基底Substrate 之1

Q1、昨天分别给出了三个智能工厂的 “面face”(里面inter-face,外面outer-face和表面surface) 以及每个“面face” 各自使用的“方”(StringProcessor,CaseFilter和ModeAdapter)  。今天我们将继续说说三个智能工厂的“方面” 。在展开之前先看一下三个单词:面向facing,取向oriented,朝向toword。理解这三个词 和

C语言程序设计 笔记代码梳理 重制版

前言 本篇以笔记为主的C语言详解,全篇一共十章内容,会持续更新基础内容,争取做到更详细。多一句没有,少一句不行!  形而上学者谓之道,形而下学者谓之器 形而上学者谓之道,形而下学者谓之器 第1章 C语言的流程 1.C程序经历的六个阶段 编辑(Edit)预处理(Preprocess)编译(Compile)汇编(Assemble)链接(Link)执行(Execute)  2.

【转载】ACM感悟

今天看了一篇我们学校前辈的ACM的感悟,觉得写的十分有道理,这里转载,文章还会不断的改进和更新。 原文链接:http://www.cnblogs.com/Chierush/p/3760870.html?ADUIN=1339764596&ADSESSION=1401536826&ADTAG=CLIENT.QQ.5329_.0&ADPUBNO=26349 声明:本文是写给弱校ACM新手的一点

我们依旧在追梦的路上-山东省第六届ACM比赛总结

这场比赛从结果而言达到了预期(金牌),从过程而言和我的预期相差甚远(打的太乱,个人发挥很差),还好关键时刻队友抗住压力,负责后果真的不堪设想。 热身赛 热身赛纯粹测机器的,先把A,B,C草草水过(A题小写x打成大写的也是醉了),我和老高开始各种测机器,long long不出所料是lld的,试了一下除0和数组越界的re问题,发现没有re,只有wa(甚至数组越界还AC了),至于栈深的话也没过多追

ACM东北地区程序设计大赛

不得不说随着参赛级别的提高,题目真的是越来越难啊,不过队长真是给力啊,在我们三个共同努力之下拿下了地区赛三等奖,哈哈我们可是大一唯一一只获奖队,终于在这次比赛打败了田大神。。。大神是失手了,俺和他差距还是挺大的。。。队友陈彤马上要去服兵役了,他说这是我们送给他最好的离别礼物,希望那家伙在部队好好干,以后谁干揍我!!!东北地区赛结束后,今年已经估计没机会参加亚洲区比赛了,赶紧补高数和线数啊!!别挂了

ACM比赛中如何加速c++的输入输出?如何使cin速度与scanf速度相当?什么是最快的输入输出方法?

在竞赛中,遇到大数据时,往往读文件成了程序运行速度的瓶颈,需要更快的读取方式。相信几乎所有的C++学习者都在cin机器缓慢的速度上栽过跟头,于是从此以后发誓不用cin读数据。还有人说Pascal的read语句的速度是C/C++中scanf比不上的,C++选手只能干着急。难道C++真的低Pascal一等吗?答案是不言而喻的。一个进阶的方法是把数据一下子读进来,然后再转化字符串,这种方法传说中

2014年ACM/ICPC亚洲区现场赛广州赛区总结

本来不想提这件事的,后来学姐找我谈心时提到这件事,我突然意识到在这件事情上我错了一次,明明答应的去参加这场比赛,最后临时决定不去......其实中间有很多很多原因 1:我和tyh,sxk临时不去主要是广州太远,我们身上money不够,呵呵。。。别笑我们,你以为我们是高富帅啊,去一趟广州消费要2个月的生活费,奖学金又没发,你让我找我妈要她辛辛苦苦挣来的工资吗?!从哈尔滨到广州单来回的火车票每个人就