1.6.1 三角形

题目大意:

有n根棍子,第i根棍子的长度为a_i,现在要从这n根棍子中选出3根棍子,组成周长尽可能大的三角形,请输出最大的周长,如果不存在,就输出0。

解题思路:

这道题,我拿到后,先看了下数据n<100,直接O(n^3)的方法是可以过去的,但是为了得到更加快速的算法,用贪心处理下,其实就能优化到

O(nlogn)。

先说说O(n^3)的方法吧,其实就是先枚举出所有的能组成三角形的方案数目,然后在这些方案中将周长最大的找出来就可以了。

代码:

# include<cstdio>
# include<iostream>
# include<algorithm>
# include<cstring>
# include<string>
# include<cmath>
# include<queue>
# include<stack>
# include<set>
# include<map>

using namespace std;

# define inf 999999999
# define MAX 123

int a[MAX];

int main(void)
{
    int n;
    while ( cin>>n )
    {
        int ans = 0;
        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++ )
                {
                    int len = a[i]+a[j]+a[k];
                    int _max = max(a[i],max(a[j],a[k]));
                    int res = len-_max;
                    if ( _max >= res )
                        continue;
                    else
                    {
                        ans = max(len,ans);
                    }
                }
            }
        }
        cout<<ans<<endl;

    }

	return 0;
}


O(nlogn)的算法,我们可以开始对于所有的边长sort一遍,时间复杂度就是O(nlogn),然后从i = 0,开始,连续的取出3条边来,如果这三条边能够组成三角形,那么他们就是我们要找的最大的边长了,因为边长一开始是通过从大到小的顺序排出来的,如果i+2>=n了,那么我们就认为在有限的条件下已经没有解能够使三角形的周长最大了。因为i+2的最大值只能取到n-1。。。。

代码:

# include<cstdio>
# include<iostream>
# include<algorithm>
# include<cstring>
# include<string>
# include<cmath>
# include<queue>
# include<stack>
# include<set>
# include<map>

using namespace std;

# define inf 999999999
# define MAX 123

int a[MAX];

int cmp ( int x,int y )
{
    return x > y;
}

int main(void)
{
    int n;
    while ( cin>>n )
    {
        int ans = 0;
        for ( int i = 0;i < n;i++ )
            cin>>a[i];
        sort(a,a+n,cmp);
        int flag = 0;
        for ( int i = 0;i < n;i++ )
        {
            if ( i+2 >= n )
            {
                flag = 1;
                break;
            }
            if ( a[i] >= a[i+1]+a[i+2] )
                continue;
            else
            {
                ans = a[i]+a[i+1]+a[i+2];
                cout<<ans<<endl;
                break;
            }
        }
        if ( flag  )
            cout<<0<<endl;
    }

	return 0;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
vdhcoapp 1.6.1是一个应用程序,它是Video Downloader Helper(VDH)的最新版本。VDH是一款非常受欢迎的视频下载工具,能够帮助用户轻松下载各种视频。该应用程序在1.6.1版本带来了许多新的功能和改进。 首先,VDHCOAPP 1.6.1大大提升了视频下载的速度和稳定性。通过优化下载算法和提升网络连接,用户可以更快地下载视频文件,并且更少出现错误或下载断的现象。这一点使得该应用程序对于那些频繁下载视频的用户来说尤为重要。 另外,这一版本还加入了对更多视频网站的支持。现在,用户可以从更多流行的视频网站如YouTube、Vimeo、Facebook等下载视频内容。无论是观看离线还是在没有网络连接的情况下,用户都可以方便地保存自己喜欢的视频。 除了下载功能,VDHCOAPP 1.6.1还提供了一些视频转换的工具。用户可以将下载好的视频文件转换成其他常见的格式,如MP4、AVI、MKV等。这意味着用户可以据自己的需要调整视频的格式和质量,以适应不同的设备和播放器。 这一版本还修复了一些已知的问题和bug,提升了用户界面的友好性和易用性。用户可以在不熟悉的情况下轻松学习使用该应用程序,并且不会遇到太多的困扰。 总的来说,VDHCOAPP 1.6.1是一个强大而实用的视频下载工具。它具有高速稳定的下载功能,支持更多的视频网站,提供视频转换工具,同时修复了一些问题和改善了用户界面。无论是保存特定的视频内容,还是需要将视频转换为其他格式,这个应用程序都能满足用户的需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值