Description
题目:
给定由一些正数(代表长度)组成的数组 A,返回由其中三个长度组成的、面积不为零的三角形的最大周长。如果不能形成任何面积不为零的三角形,返回 0。
例如:
输入[2,1,1] 输出0;
输入[2,3,4] 输出9;
解题思路:
贪心算法:先将给出的数经过排序,再从大到小开始判断,若满足条件则退出
正常做法:把每次判断三个不重复的数,遍历全部可能在再根据条件i退出
具体算法:
贪心算法:
#include<stdio.h>
//木棍拼三角问题
int n;
int enter(int k[])//输入
{
printf("输入木根个数与具体的木棍长度\n");
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%d",&k[i]);
}
int Sort(int k[])//大到小排序
{
for(int i=0;i<n;i++)
for(int l=i+1;l<n;l++)
if(k[i]<k[l])
{k[i]=k[l]^k[i];k[l]=k[l]^k[i];k[i]=k[l]^k[i];}
}
int algorithm(int k[])//核心算法
{
int m=0;
for(int i=0;i+2<n;i++)
if(k[i]<k[i+1]+k[i+2]) {m=k[0]+k[1]+k[2];printf("\n%d\n",m);return 0;}
printf("\n0\n");
}
int main()
{
int k[n];
enter(k);
Sort(k);
algorithm(k);
}
正常法:
#include<stdio.h>
#define max(a,b) ( ((a)>(b)) ? (a):(b) )
#define min(a,b) ( ((a)>(b)) ? (b):(a) )
int main()
{
int q,k[q],z=0;
int A,B,C;
scanf("%d",&q);
for(int i=0;i<q;i++)
scanf("%d",&k[i]);
for(int a=0;a<q;a++)
for(int b=a+1;b<q;b++)
for(int c=a+2;c<q;c++)
if(k[a]==0||k[b]==0||k[c]==0||k[a]==k[b]||k[a]==k[c]||k[b]==k[c])
continue;
else
{A=k[a]+k[b]+k[c];
B=max(max(k[a],k[b]),k[c]);
C=A-B;
if(C>B) if(A>z) z=A;}
printf("",A);
printf("\n%d",z);
}