牛客网 题号16119 标题:三角形(Java版)

牛客网 题号16119 标题:三角形(Java版)

题目:链接:https://ac.nowcoder.com/acm/problem/16119
来源:牛客网

铁子从森林里收集了n根木棍,她开始将它们按顺序的排成一排,从左到右依次为1到n,她回想起
在数学课上老师教她的三角形知识,她开始从这些木棍中间找三根木棍来组成一个周长最大的三角形,
这时她的兄弟顺溜偷偷的溜了过来,偷走了第i根木棍,现在她想知道现在能够组成周长最大的三角形
的周长是多少?

在这里插入图片描述
在这里插入图片描述

解题思路

题目中说从一堆数字中选三个值作为三角形三边且周长最大,那选的三个值必须满足任意两个值大于第三个值(基本的三角形定理),那怎么获得这三个值还要确保周长最大?用三个for循环暴力破解?肯定不行撒,我是先对拿到的数据先排序,你要明白一点:假如有a,b,c,d四个值,a<b<c<d,那么a+b>d一定有b+c>d,那么你要取的三个值必定是紧邻关系,不然就不可能是最大周长,这也是我为什么排序的原因。那个被拿走的数据如何处理?你可以将数据放入结构体中,用两个结构体变量来对应的相应的编号和值。最后用一个for循环来逆序遍历一遍选出符合条件的即可输出。

测试结果:
在这里插入图片描述
测试代码:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.io.StreamTokenizer;
import java.util.Arrays;
import java.util.Comparator;

public class Main 
{
   //结构体
	static class node
	{
		int num;
		long value;
		node(int num,long value)
		{
			this.num=num;
			this.value=value;
		}
	}
	//排序规则为升序
	static class cmp implements Comparator<node>
	{
		public int compare(node a,node b)
		{
			if(a.value>b.value)
				return 1;
			else 
				return -1;
			
		}
	}
	public static void main(String[] args) {
		StreamTokenizer in=new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
		PrintWriter out=new PrintWriter(System.out);
		try {
			in.nextToken();
			int n=(int)in.nval;
			long value;
			node[] a=new node[n+2];
			long[] b=new long[4];//用来存三角形三边的值
			in.nextToken();
			int m=(int)in.nval;
			for(int i=1;i<=n;i++)
			{
				in.nextToken();
				value=(long)in.nval;
				a[i]=new node(i, value);
			}
			if(n<=3)
			{
				for(int i=0;i<m;i++)
				{
					in.nextToken();
					int r=(int)in.nval;
					out.println(-1);
				}
			}
			else 
			{
				Arrays.sort(a,1,n+1,new cmp());//排序
				for(int i=0;i<m;i++)
				{
					in.nextToken();
					int r=(int)in.nval,num=0;
					long max=0;
					for(int j=n;j>=1;j--)
					{
						if(a[j].num!=r)
						{
							b[num]=a[j].value;
							num++;
							if(num==3)
							{
								//一旦找到立马退出,不多bb,减少开销
								if(b[2]+b[1]>b[0])
								{
									max=b[0]+b[1]+b[2];
									break;
								}
								//没找到就移位,去除最高位
								else
								{
									b[0]=b[1];
									b[1]=b[2];
									num--;
								}
							}
						}
					}
					if(max==0)
						out.print(-1);
					else
						out.print(max);
					if(i!=m-1)
					{
						out.println();
					}
				}
			}
			out.flush();
			out.close();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值