牛客网 题号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();
}
}
}