古いは深刻ではありません

誰もが、私は問題外だと言い、「昔は、深刻ではない」まあ、私はまともに戻ります、私は著者の「深刻」だこれが問題であることを伝える必要があり、そしてこの質問は困難です。

順次もしN(1 <= N <=伝えるインクリメント 1000000) 正の整数(それぞれ正の整数であり、2未満の31)と、正の実数P(0.000001 <= P <= 10。8)、列数を得るために必要なP、B(すなわち、二つの数、Bを取って、そして、Bは同じ、そのような工場であってもよい((二重)A / Bの数に近い位置にある2つの比率 - P) 、および処理された画分分)表現。例えば、最終的な答えは3/3、1/1出力であり、出力は、たとえば、最終的な答えは、4/6、2/3です。

入力

有多组数据,每组数据有3行:第一行一个正整数n,表示给出数列中数的个数;第二行n个正整数,
并且数列递增,两个数之间用一个空格隔开;第三行一个正实数p。

出力

每组数据对应一个输出,表示要求的那个分数,a/b最简分数形式。

サンプル入力

5
1 4 5 6 7
0.666

サンプル出力

2/3
#include<bits/stdc++.h>
using namespace std;
const double EPS=1e-6;
const int MAXN=1000005;
int n,l,r;
long long a[MAXN],up,down;
double x;
int main()
{
    while(scanf("%d",&n)!=EOF)
    {
        up=down=0;
        for(int i=1;i<=n;++i)
        {
            scanf("%lld",&a[i]);
        }
        sort(a+1,a+1+n);
        scanf("%lf",&x);
        int r=1;
        for(int i=1;i<=n;++i)
        {
            while((double)a[i]/(double)a[r]>x&&r<n)++r;
            if(!down||abs(x-(double)a[i]/(double)a[r])<abs(x-(double)up/(double)down))
            {
                up=a[i];
                down=a[r];
            }
            if(r>1&&(!down||abs(x-(double)a[i]/(double)a[r-1])<abs(x-(double)up/(double)down)))
            {
                up=a[i];
                down=a[r-1];
            }
        }
        long long g=__gcd(up,down);
        up/=g;
        down/=g;
        printf("%lld/%lld\n",up,down);
    }

    return 0;
}

おすすめ

転載: blog.csdn.net/weixin_44061561/article/details/94555377