• 隐形的翅膀(玄学离散化)


    背景

    小杉终于进入了天堂。他看到每个人都带着一双隐形翅膀,他也想要。
    (小杉是怎么看到的?……)
    描述

    天使告诉小杉,每只翅膀都有长度,两只翅膀的长度之比越接近黄金分割比例,就越完美。
    现在天使给了小杉N只翅膀,小杉想挑出一对最完美的。
    格式

    输入格式

    每组测试数据的
    第一行有一个数N(2<=N<=30000)
    第二行有N个不超过1e5的正整数,表示N只翅膀的长度。
    20%的数据N<=100
    输出格式

    对每组测试数据输出两个整数,表示小杉挑选出来的一对翅膀。
    注意,比较短的在前,如果有多对翅膀的完美程度一样,请输出最小的一对。
    样例1

    样例输入1

    4
    2 3 4 6
    Copy
    样例输出1

    2
    3
    Copy
    限制

    每个测试点1s
    提示

    你可以认为黄金分割比就是0.6180339887498949

    分析
    这题很神奇,看不懂为什么这是离散化?
    这题就是一个O(N)的事。

    程序:

    #include <iostream>
    #include <cstdio>
    #include <algorithm>
    #include <cmath>
    using namespace std;
    double gold=0.6180339887498949,q,mx;
    int n,a[30001];
    int i,j,ass,stick;
    bool cmp(int a,int b)
    {
        return a<b;
    }
    int main()
    {
        scanf("%d",&n);
        for (i=1;i<=n;i++)
        scanf("%d",&a[i]);
        sort(a+1,a+n+1,cmp);
        mx=2147483647.0;
        for (i=1;i<=n;i++)
        {
            q=(double)a[i]/gold;
            for (j=i+1;j<=n;j++)
            {
                if (mx>abs((double)a[j]-q))
                {
                    mx=abs((double)a[j]-q);
                    ass=i;
                    stick=j;
                }
                if ((double)a[j]-q>0) break;
            }
        }
        printf("%d
    %d",a[ass],a[stick]);
    }
  • 相关阅读:
    函数
    数组
    类的例题
    异常语句
    类的学习
    for的穷举、迭代
    for循环
    switch case
    反相器,扇入扇出
    T触发器,JK触发器的verilog实现
  • 原文地址:https://www.cnblogs.com/YYC-0304/p/9500013.html
Copyright © 2020-2023  润新知