码迷,mamicode.com
首页 > 其他好文 > 详细

天大夏令营机试第三题

时间:2018-07-11 15:11:19      阅读:153      评论:0      收藏:0      [点我收藏+]

标签:def   ret   size   数字   i+1   大致   scan   ems   ||   

题目

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

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

但他们只有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;
    }
}

 

天大夏令营机试第三题

标签:def   ret   size   数字   i+1   大致   scan   ems   ||   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!