vijos1237-隱形的翅膀【離散化】

weixin_30924079發表於2020-04-04

正題

題目連結:https://vijos.org/p/1237


大意

有n支長度不一翅膀,要求選擇兩隻最接近黃金分割率的翅膀。


解題思路

暴力列舉O(n2)O(n2)是過不了的。

所有這就要用到離散了,給翅膀長度排序。
然後一個i和一個j,根據算出的比黃金分割率大或小可以判斷選擇i和j那個需要增加翅膀。
時間複雜度O(nlogn)O(nlogn)


程式碼

#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]);//輸出
}

轉載於:https://www.cnblogs.com/sslwyc/p/9218527.html

相關文章