正题
大意
有n支长度不一翅膀,要求选择两只最接近黄金分割率的翅膀。
解题思路
暴力枚举 是过不了的。
所有这就要用到离散了,给翅膀长度排序。
然后一个i和一个j,根据算出的比黄金分割率大或小可以判断选择i和j那个需要增加翅膀。
时间复杂度
代码
#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]);//输出
}