三角形问题的解决复杂度O(n^3)和O(nlogn)的比较
问题描述:
n条棍子组成一个三角形,使得三角形周少最大。
方法一:
暴力解则算法复杂度为O(n^3)
#include<stdio.h>
const int MAX_N=105
int main()
{
void min(int &a,int &b);
int n,i,j,k,sum=0;
int ans[MAX_N];
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d",&ans[i]);
}
for(i=0;i<n;i++)
{
for(j=i+1;j<n;j++)
{
for(k=j+1;k<n;k++)
{
min(ans[i],ans[j]);min(ans[i],ans[k]);min(ans[j],ans[k]);
if(ans[i]+ans[j]>ans[k])
{
if(ans[i]+ans[j]+ans[k]>sum)
sum=ans[i]+ans[j]+ans[k];
}
}
}
}
printf("%d\n",sum);
return 0;
}
void min(int &a,int &b)
{
int t;
if(a>b)
{
t=a;a=b;b=t;
}
}
方法二:
从大到小将棍子排序,然后依次检查棍子是否满足A<B+C的情况,第一次满足的情况即答案,复杂度O(nlogn)
#include<stdio.h>
const int MAX_N=105;
int main()
{
int n,i,j,sum=0;
int ans[MAX_N];
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d",&ans[i]);
}
for(i=0;i<n-1;i++)
{
for(j=i+1;j<n;j++)
{
if(ans[j]>ans[i])//ans[i]与ans[j]值进行交换
{
ans[j]=ans[j]+ans[i];
ans[i]=ans[j]-ans[i];
ans[j]=ans[j]-ans[i];
}
}
}
for(i=0;i<n-2;i++)
{
if(ans[i]<ans[i+1]+ans[i+2])
{
sum=ans[i]+ans[i+1]+ans[i+2];
break;
}
}
printf("%d\n",sum);
return 0;
}
┆ 凉 ┆ 暖 ┆ 降 ┆ 等 ┆ 幸 ┆ 我 ┆ 我 ┆ 里 ┆ 将 ┆ ┆ 可 ┆ 有 ┆ 谦 ┆ 戮 ┆ 那 ┆ ┆ 大 ┆ ┆ 始 ┆ 然 ┆
┆ 薄 ┆ 一 ┆ 临 ┆ 你 ┆ 的 ┆ 还 ┆ 没 ┆ ┆ 来 ┆ ┆ 是 ┆ 来 ┆ 逊 ┆ 没 ┆ 些 ┆ ┆ 雁 ┆ ┆ 终 ┆ 而 ┆
┆ ┆ 暖 ┆ ┆ 如 ┆ 地 ┆ 站 ┆ 有 ┆ ┆ 也 ┆ ┆ 我 ┆ ┆ 的 ┆ 有 ┆ 精 ┆ ┆ 也 ┆ ┆ 没 ┆ 你 ┆
┆ ┆ 这 ┆ ┆ 试 ┆ 方 ┆ 在 ┆ 逃 ┆ ┆ 会 ┆ ┆ 在 ┆ ┆ 清 ┆ 来 ┆ 准 ┆ ┆ 没 ┆ ┆ 有 ┆ 没 ┆
┆ ┆ 生 ┆ ┆ 探 ┆ ┆ 最 ┆ 避 ┆ ┆ 在 ┆ ┆ 这 ┆ ┆ 晨 ┆ ┆ 的 ┆ ┆ 有 ┆ ┆ 来 ┆ 有 ┆
┆ ┆ 之 ┆ ┆ 般 ┆ ┆ 不 ┆ ┆ ┆ 这 ┆ ┆ 里 ┆ ┆ 没 ┆ ┆ 杀 ┆ ┆ 来 ┆ ┆ ┆ 来 ┆