天大夏令营机试第三题

题目

(天大机试是全英文的,这里题目是我凭记忆翻译出来的,错了别打我)

小红和小明要做风筝,小红认为直角三角形的风筝最好了(别问我怎么知道的)

但他们只有n根木棍,要从中间选出可以做成最大直角三角形的三根。

输入

第一行给你一个T,表示接下来要做T个风筝

剩下每次输入一个数N,表示现有N根木棍

后面一行输入N个数字,表示这几根木棍的长度

输出

输出能拼成最大三角形的三根木棍(升序输出)

示例输入

2

5

3  6 8 4 5

6

3 12 4 5 13 10

输出

3 4 5

5 12 13

我这道题做的时候仅仅过了部分样例

大致思想是,求出数组里所有能组成直角三角形的木棍,然后按斜边大小对其排序,最后升序输出

(= =)不知道哪里错了,有大佬来看看就好了

#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
bool tra(int a,int b,int c)
{
	if (a+b>c&&b+c>a&&a+c>a)
	{
	 if ((a*a + b*b == c*c) || (a*a + c*c == b*b) || (b*b + c*c == a*a))
	return 1;
    else
	return 0;
	}
	else
	return 0;
}
void judge(int a[],int n)
{
	int c[n][3]={0};
	int f=0;
	for(int i=0;i<n;i++)
	for(int j=i+1;j<n;j++)
	for(int k=j+1;k<n;k++)
	{
		if(tra(a[i],a[j],a[k])==1)
		{
		 c[f][0]=a[i];
		 c[f][1]=a[j];
		 c[f][2]=a[k];
		 f++;
		 }
	}
	for(int i=0;i<f;i++)
	sort(c[i],c[i]+3);
	for(int i=0;i<f;i++)
	for(int j=0;j<f-1;j++)
	{
		if(c[j][2]<c[j+1][2])
		swap(c[j],c[j+1]);
	}
	if(c[0][2]!=0)
	cout<<c[0][0]<<" "<<c[0][1]<<" "<<c[0][2]<<endl;

}

int main()
{
	int t;
	cin>>t;
	while(t--)
	{
	  int num;
	  cin>>num;
	  int a[num];
	  for(int i=0;i<num;i++)
	  cin>>a[i];
	  judge(a,num);
	}
	return 0;
}

  上面代码可能超时,由于不知道数据范围,暂定为1000和1e5

#define ll long long

#include<iostream>
#include<algorithm>
#include<string.h>
#include<stdio.h>
#include<math.h>
using namespace std;
int n;ll num[10005];
int vis[100005];
bool judge(ll x,ll y)
{
    ll ans=x*x+y*y;
    ll t=sqrt(ans);
    if(ans==t*t&&vis[t])return true;
    return false;
}
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d",&n);
        memset(vis,0,sizeof(vis));
        for(int i=0;i<n;i++)
        {
            scanf("%lld",&num[i]);
            vis[num[i]]=1;
        }
        sort(num,num+n);
        int ans[3];
        for(int i=0;i<n;i++)
        {
            for(int j=1;j<n;j++)
            {
                if(judge(num[i],num[j]))
                {
                    ans[0]=num[i];ans[1]=num[j];
                    ans[2]=sqrt(ans[0]*ans[0]+ans[1]*ans[1]);
                }
            }
        }
        sort(ans,ans+3);
        cout<<ans[0]<<" "<<ans[1]<<" "<<ans[2]<<endl;
    }
}

原文地址:https://www.cnblogs.com/fantastic123/p/9293521.html

时间: 2024-10-11 05:40:25

天大夏令营机试第三题的相关文章

【算法】搞定[机试]算法刷题 全文超过80页pdf

目录 算法专题 一.树和图 1. 二叉树构造和遍历 2. 朋友圈 - 并查集 3. 公共朋友 - 非朋友圈 4. 哈夫曼树 5. 其他二叉树性质相关计算 6. 图的连通分量 7. 最小生成树 8. 单源最短路径 - dijkstra 二.枚举搜索 1. 按钮开关问题 2. 多层枚举问题 三.递归搜索 1. 简单递归 2. 递增排列组合类 3. 全排列问题 4. 草丛问题 5. 迷宫问题 6. 广度优先搜索的剪枝 7. 总操作步数固定枚举问题 四.数学问题 1. 高精度计算 2. 素数和质因子分解

华为机试4[编程题] 删数

[编程题] 删数 有一个数组a[N]顺序存放0~N-1,要求每隔两个数删掉一个数,到末尾时循环至开头继续进行,求最后一个被删掉的数的原始下标位置.以8个数 (N=7)为例:{0,1,2,3,4,5,6,7},0->1->2(删除)->3->4->5(删除)-> 6->7->0(删除),如此循环直到最后一个数被删除. 输入描述: 每组数据为一行一个整数n(小于等于1000),为数组成员数,如果大于1000,则对a[999]进行计算. 输出描述: 一行输出最后一

西工大10级保研机试 柱状图

1021.柱状图 时限:1000ms 内存限制:10000K 总时限:3000ms 描述 写一个程序,读入4行大写字母(每行不超过80个字符),打印出如Sample Output的一个垂直的柱状图显示出每个大写字母出现的次数(只显示大写字母,不显示空格.数字和标点符号等). 输入 输入4行ASCII码字符,每行不超过80个字符. 输出 如图形式输出,输出中任何一行的行尾不能包含无用的空格,也不要在开始输出任何空行. 输入样例 THE QUICK BROWN FOX JUMPED OVER THE

[华为机试真题]70.分苹果

题目 M个相同苹果放到N个相同篮子里有多少种放法,允许有篮子不放. 1<=M<=10,1<=N<=10 例如5个苹果三个篮子,3,1,1 和 1,1,3是同一种放法 输入 7 3 输出 8 思路 设f(m,n) 为m个苹果,n个盘子的放法数目: 当n>m:必定有n-m个盘子永远空着,去掉它们对摆放苹果方法数目不产生影响.即if(n>m) f(m,n) = f(m,m) 当n<=m:不同的放法可以分成两类: (1)有至少一个盘子空着,即相当于f(m,n) = f(m

[华为机试真题]66.单词搜索

题目 代码 /*--------------------------------------- * 日期:2015-07-06 * 作者:SJF0115 * 题目:WordSearch * 来源:华为机试真题 -----------------------------------------*/ #include <iostream> #include <string> #include <vector> #include <stack> #include

九度机试 题目1165:字符串匹配 2008年北京航空航天大学计算机研究生机试真题

题目1165:字符串匹配 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:2497 解决:858 题目描述: 读入数据string[ ],然后读入一个短字符串.要求查找string[ ]中和短字符串的所有匹配,输出行号.匹配字符串.匹配时不区分大小写,并且可以有一个用中括号表示的模式匹配.如"aa[123]bb",就是说aa1bb.aa2bb.aa3bb都算匹配. 输入: 输入有多组数据. 每组数据第一行输入n(1<=n<=1000),从第二行开始输入n个字符串(

华为机试 --- 求最大三位数

题目:输入10位0-9数字,取其中三位不同数字组合,求组合出来的最大三位数. 如输入 1 2 3 4 5 6 7 8 9 0,组合出来987最大. 测试代码如下: #include <stdio.h> #include <stdlib.h> int IsSame(int *a, int num); int main() { int i=0; int j=0; int a[10]={0}; int input =0; int length =0; int temp=0; for (i

[华为机试真题][2015]65.和尚挑水

题目 某寺庙里7个和尚:轮流挑水,为了和其他任务不能冲突,各人将有空天数列出如下表: 和尚1: 星期二,四; 和尚2: 星期一,六; 和尚3: 星期三,日; 和尚4: 星期五; 和尚5: 星期一,四,六; 和尚6: 星期二,五; 和尚7: 星期三,六,日; 请将所有合理的挑水时间安排表 思路 回朔法求解 回朔法即每进行一步,都试图在当前部分解的基础上扩大该部分解.扩大时,首先检查扩大后是否违反了约束条件,若不违反,则扩大之,然后继续在此基础上按照类似的方法进行,直至成为完整解:若违反,则放弃该步

2005年华中科技大学计算机保研机试真题 找位置

题目1199: 1 #include <iostream> 2 #include <cstring> 3 #include <cstdio> 4 #include <vector> 5 using namespace std; 6 struct node{ 7 vector<int> v; 8 }; 9 node map['z'+1]; 10 int main(){ 11 string s; 12 while(cin>>s){ 13