提出问题:
有n根棍子,棍子i的长度为ai。想要从中选出3跟棍子组成周长尽可能场的三角形。请输出最大的周长,若无法组成三角形则输出0。
方法一、暴力求解法:三个循环以次求解周长,找出最大值。
#include<iostream>
#define MAX_N 100
bool isTriangle(int a, int b, int c);
int main()
{
using namespace std; //创建命名空间
int n; //棍子根数
int a[MAX_N]; //创建每根棍子长度数组
int Max_C = -1;
cin >> n;
for (int i = 0; i < n; i++) //循环输入棍子长度
{
cin >> a[i];
}
for (int i = 0; i < n; i++)
{
for (int j = i+1; j < n; j++)
{
for (int k = j+1; k < n; k++)
{
if (isTriangle(a[i], a[j], a[k]) == true)
if (Max_C < (a[i] + a[j] + a[k]))
Max_C = a[i] + a[j] + a[k];
else;
}
}
}
if (Max_C == -1)
cout << "无论如何都组不成三角形";
else
cout << Max_C;
return 0;
}
bool isTriangle(int a, int b, int c)
{
if (a > b && a > c && a < b + c)
{
return true;
}
else if (b > a && b > c && b < a + c)
{
return true;
}
else if (c > a && c > b && c < a + b)
{
return true;
}
else return false;
}
中间尝试一下四目运算符比较两数的大小
#include<iostream>
#define min(a,b) (a<b)?a:b //四目运算符
int main()
{
using namespace std;
int a = 1;
int b = 2;
int ans = min(a, b);
cout << ans;
return 0;
}
接下来就是nlogn的算法
1、排序
2、只需要找符合条件的相邻的三个数组成三角形的周长最长就行。
假设排序完后边长数组为 a,b,c,d,e。那么a+b>e则c+d>e恒成立。
所以这个方法里只需要考虑排序算法的算法复杂度即可,后者复杂度为n。
#include<iostream>
#include<algorithm> #算法库,中间有排序函数
#define MAX_N 100
bool isTriangle(int a, int b, int c);
int main()
{
using namespace std; //创建命名空间
int n; //棍子根数
int a[MAX_N]; //创建每根棍子长度数组
int Max_C = -1;
cin >> n;
for (int i = 0; i < n; i++) //循环输入棍子长度
{
cin >> a[i];
}
sort(&a[0],&a[n-1]);
for (int i = 0; i < n-2; i++)
{
if(isTriangle(a[i],a[i+1],a[i+2]))
if(a[i]+a[i+1]+a[i+2]>Max_C)
Max_C = a[i]+a[i+1]+a[i+2];
}
if (Max_C == -1)
cout << "无论如何都组不成三角形";
else
cout << Max_C;
return 0;
}
bool isTriangle(int a, int b, int c)
{
if (a > b && a > c && a < b + c)
{
return true;
}
else if (b > a && b > c && b < a + c)
{
return true;
}
else if (c > a && c > b && c < a + b)
{
return true;
}
else return false;
}