三角形问题的解决复杂度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;
}
posted @   zxzhang  阅读(853)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示

目录导航