正題
大意
有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]);//輸出
}