首页 > 试题广场 >

拼凑三角形

[编程题]拼凑三角形
  • 热度指数:5199 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
牛牛手中有三根木棍,长度分别是a,b,c。牛牛可以把任意一根木棍长度削短,牛牛的目标是让这三根木棍构成一个三角形,并且牛牛还希望这个三角形的周长越大越好。

输入描述:
输入包括一行,一行中有正整数a, b, c(1 ≤ a, b, c ≤ 100), 以空格分割


输出描述:
输出一个整数,表示能拼凑出的周长最大的三角形。
示例1

输入

1 2 3

输出

5

python两行

a, b, c = sorted(map(int, input().split()))
print(a + b + c if a + b > c else (a + b) * 2 - 1)

将三个边长排序,如果长度小的两边加起来大于最长的边,肯定可以组成三角形,
某则,最长的边就要进行切割,切割到a + b - 1, 此时周长为a + b + a + b - 1 = ??

发表于 2019-02-24 19:17:00 回复(2)
import java.util.Arrays;
import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int[] arr = new int[3];
        arr[0] = sc.nextInt();
        arr[1] = sc.nextInt();
        arr[2] = sc.nextInt();
        Arrays.sort(arr);
        while (arr[2] >= arr[0] + arr[1]) {
            arr[2]--;
        }
        System.out.println(arr[0] + arr[1] + arr[2]);
    }
}
发表于 2019-06-17 19:51:24 回复(0)
JAVA
import java.util.*;
public class Main {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner cin=new Scanner (System.in);
		int a[]=new int [3];
		for(int i=0;i<3;i++) {
			a[i]=cin.nextInt();
		}
		Arrays.sort(a);
		if(a[0]+a[1]<=a[2])a[2]=a[2]-(a[2]-(a[0]+a[1]))-1;
				
		int out=0;
		out=a[0]+a[1]+a[2];
		System.out.print(out);
		

	}

}


发表于 2019-11-06 22:26:01 回复(0)
三角形的构成规则: 任意两边之和大于第三边,任意两边之差小于第三边 转化为 最小的两边之和大于最大的边 所以,先对三条边进行排序,若满足,则直接输出;若不满足,则缩短最大的边 #include <iostream> #include <algorithm>   using namespace std; int main() {     int t[3]={0};     for(int i=0;i<3;i++)     {         cin>>t[i];     }     sort(t,t+3);     if(t[0]+t[1]>t[2])     {         cout<<t[0]+t[1]+t[2]<<endl;     }     else     {         t[2]=t[0]+t[1]-1;         cout<<t[0]+t[1]+t[2]<<endl;     }     return 0; }

编辑于 2019-04-24 16:59:07 回复(0)

python多行

L = list(map(int,input().split()))
L.sort()
if L[0]+L[1]>L[2]:
    print(sum(L))
else:
    print((L[0]+L[1])*2-1)

发表于 2019-04-13 09:50:18 回复(0)
import java.util.*;
public class Main{
    public static void main(String [] args){
        Scanner sc=new Scanner(System.in);
        int a=sc.nextInt();
        int b=sc.nextInt();
        int c=sc.nextInt();
        int [] d=new int[3];
        int sum=0;
        d[0]=a;d[1]=b;d[2]=c;
        Arrays.sort(d);
        if(d[0]+d[1]<=d[2]) {sum=d[0]+d[1]+d[2]-(d[2]-d[0]-d[1]+1);}
            else{
                sum=d[0]+d[1]+d[2];
            }
        System.out.println(sum);
    }
    
}
发表于 2019-04-06 11:37:31 回复(0)
这题也挺简单的,循环直到满足三角形构成条件为止,即两边之和大于第三边,跳出。否则应该使之取能构成三角形的最大值,即为另两边之和-1
 #include<iostream>
using namespace std;
int main(){
    int a,b,c;
    cin>>a>>b>>c;
    while(1){
        if(a+b<=c)
            c=a+b-1;
        if(a+c<=b)
            b=a+c-1;
        if(b+c<=a)
            a=b+c-1;
        if(a+b>c&&b+c>a&&a+c>b)
            break;
    }
    cout<<a+b+c<<endl;
}

发表于 2019-03-05 17:57:01 回复(0)
#include <bits/stdc++.h>

using namespace std;

int main()
{     int a[3];     for(int i=0;i<3;i++)         cin>>a[i];     sort(a,a+3);     if(a[0]+a[1]>a[2])         cout<<a[0]+a[1]+a[2]<<endl;     else         cout<<2*(a[0]+a[1])-1<<endl;     return 0;
}

发表于 2019-02-16 02:03:19 回复(0)
import java.util.*;
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int[] lens = new int[3];
        for (int i=0; i!=3; i++) {
            lens[i] = sc.nextInt();
        }
        Arrays.sort(lens);
        if (lens[0] + lens[1] > lens[2]) {
            System.out.println(lens[0] + lens[1] + lens[2]);
        }
        else {
            System.out.println(2 * (lens[0] + lens[1]) - 1);
        }
    }
}
发表于 2019-01-21 16:33:46 回复(0)
 import java.util.*;
public class Main{
    public static void main(String[] args){
        try(Scanner in = new Scanner(System.in)){
            int[] sides = new int[3];
            for(int i = 0;i < 3;i++){
                sides[i] = in.nextInt();
            }
            System.out.println(helper(sides));
        }
    }
    public static int helper(int sides[]){
        Arrays.sort(sides);
        if(sides[0] + sides[1] > sides[2]) return sides[0] + sides[1] + sides[2];
        else return 2 * (sides[0] + sides[1]) - 1;
    }
}

发表于 2019-01-18 16:21:57 回复(0)
var str = readline()
var arr = str.split(" ");
 arr.sort(function(a,b){
    return b -a;
}); //降序
 for(var i = arr[0];i>0;i--){  //最大的边削短
      if(parseInt(arr[1])+parseInt(arr[2])>parseInt(arr[0])){ //两边之和大于第三边
         print(parseInt(arr[1])+parseInt(arr[2])+parseInt(arr[0]));
         break;
     }
     else{
         arr[0]--;
     }
 }
发表于 2018-08-16 11:31:37 回复(0)
let arr=readline().split(' ');
function max_sum(arr){
    arr.sort(function(a,b){
        return a-b;
    });
    arr=arr.map(function(value){
        return value*=1;
    });
    let max=arr[2],two_sum=arr[0]+arr[1];
    if(max>=two_sum){
        return two_sum*2-1;
    }
    return max+two_sum;
}
console.log(max_sum(arr));
发表于 2018-03-14 18:03:23 回复(3)
#include<stdio.h>
#include<algorithm>
using namespace std;
int main(){
    int a[3],i;
    for(i=0;i<3;i++) scanf("%d",a+i);
    for(sort(a,a+3);a[2]>=a[0]+a[1];a[2]--);
    printf("%d",a[0]+a[1]+a[2]);
}

发表于 2017-11-29 13:34:28 回复(1)
if __name__ == '__main__':
    array=list(map(int,input().split(" ")))
    array.sort() if array[0]+array[1]>array[2]: print(sum(array)) else:
        c=array[0]+array[1]-1  print(sum(array[:2])+c)


发表于 2019-02-03 12:59:02 回复(0)
#include<stdio.h> int main(){ int a, b, c, d, e; scanf("%d%d%d",&a,&b,&c); d=a>b?(a>c?a:c):(b>c?b:c); if(d</stdio.h>
发表于 2021-11-16 19:43:39 回复(0)
#include<bits/stdc++.h>

using namespace std;

int main()
{
	int z, x, c;
	cin >> z >> x >> c;
	vector<int> vi;
	vi.push_back(z);
	vi.push_back(x);
	vi.push_back(c);
	sort(vi.begin(), vi.end());
	while (vi[0] + vi[1] <= vi[2])vi[2]--;
	cout << vi[0] + vi[1] + vi[2];
}

发表于 2020-04-11 14:36:51 回复(0)
链接:https://www.nowcoder.com/questionTerminal/d9f5dbd3b57d450e8406e102573d4bdd
来源:牛客网
num_list = list(map(int,input().split(" ")))

while True:
    num_list.sort()
    a,b,c = num_list
    if (a+b>c):
        break
    else:
        num_list[-1] -= 1
print(sum(num_list))

对于能不能构成三角形的首要条件是任意两边之和要大于第三边,限制这个条件的往往是最短的两边之和未必能大于最长的那条边,所以进行排序,只需要最短两边大于最长两边即可,否则将最长边减1,不断循环,直到满足条件 
发表于 2020-03-22 09:42:56 回复(0)
let a = readline().split(' ')
    .map(function (item,index) {
      return parseInt(item)
    })
    .sort(function (a,b) {
      return a-b
    })
if(a[0]+a[1]>a[2]){
  console.log(a[0]+a[1]+a[2])
}
else{
  console.log(2*(a[0]+a[1])-1)
}

发表于 2020-03-10 12:09:46 回复(0)
            string input = string.Empty;
            while (!string.IsNullOrEmpty(input = Console.ReadLine()))
            {
                int[] arr = input.Split(' ').Select(x => int.Parse(x)).OrderBy(x => x).ToArray();
                int a = arr[0];
                int b = arr[1];
                int c = arr[2];

                if (a + b > c)
                {
                    Console.WriteLine(a + b + c);
                }
                else
                {
                    c = a + b - 1;
                    Console.WriteLine(a + b + c);
                }
            }

发表于 2020-01-15 10:20:21 回复(0)
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
    int a[3],i;
    for(i=0;i<3;++i)
        cin>>a[i];
    sort(a,a+3);
    if(a[0]+a[1]>a[2])
        printf("%d",a[0]+a[1]+a[2]);
    else
        printf("%d",2*(a[0]+a[1])-1);
}

发表于 2020-01-14 14:18:00 回复(0)