正题
题目链接: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还是加jwhile (a[j]==0) j++;//跳过所有0}printf("%.0lf\n%.0lf",a[s1],a[s2]);//输出
}