zoukankan      html  css  js  c++  java
  • 三角形问题的解决复杂度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
    ",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
    ",sum);
    	return 0;
    }
    
  • 相关阅读:
    查看.NET Core源代码通过Autofac实现依赖注入到Controller属性
    序列化二叉树
    把二叉树打印成多行
    按之字形顺序打印二叉树
    对称的二叉树
    JDK源码阅读顺序
    二叉树的下一个结点
    删除链表中重复的结点
    链表中环的入口结点
    字符流中第一个不重复的字符
  • 原文地址:https://www.cnblogs.com/ZhaoxiCheung/p/5202868.html
Copyright © 2011-2022 走看看