vijos1237-隐形的翅膀【离散化】

正题

题目链接:https://vijos.org/p/1237


大意

有n支长度不一翅膀,要求选择两只最接近黄金分割率的翅膀。


解题思路

暴力枚举 O ( n 2 ) 是过不了的。

所有这就要用到离散了,给翅膀长度排序。
然后一个i和一个j,根据算出的比黄金分割率大或小可以判断选择i和j那个需要增加翅膀。
时间复杂度 O ( n l o g n )


代码

#include<cstdio>
#include<algorithm>
using namespace std;
const double bl=0.6180339887498949;//黄金分割率
int n,s1,s2;
double a[30001],k,mins;
double abs(double k)//abs
{
    if (k<0) return -k;
    return k;
}
int main()
{
    scanf("%d",&n);
    for (int i=1;i<=n;i++)
      scanf("%lf",&a[i]);
    sort(a+1,a+1+n);
    int i=1;
    int j=2;
    mins=2147483647;
    while (j<=n)
    {
        k=a[i]/a[j]-bl;//距离黄金分割率
        if (abs(k)<mins) {mins=abs(k);s1=i;s2=j;}//更优解
        if (k<0) {i++;}
        else {j++;}//判断加i还是加j
        while (a[j]==0) j++;//跳过所有0
    }
    printf("%.0lf\n%.0lf",a[s1],a[s2]);//输出
}

猜你喜欢

转载自blog.csdn.net/mr_wuyongcong/article/details/80030324