夢追い人

"It takes a dreamer to make a dream come true."―Vincent Willem van Gogh

わー

疲れてたので1完に甘んじたらレート下がっちゃいました、てへぺろ
Bオーダー落とせないorz

A

#include <cstdio>
#include <algorithm>
using namespace std;
int n, m;
int a[50], b[50];
int main() {
    scanf("%d",&n);
    for (int i=0; i<n; i++) scanf("%d",&a[i]);
    scanf("%d",&m);
    for (int i=0; i<m; i++) scanf("%d",&b[i]);
    int res=0;
    for (int i=0; i<n; i++) {
        for (int j=0; j<m; j++) {
            if (b[j]%a[i]!=0) continue;
            res=max(res, b[j]/a[i]);
        }
    }
    int ans=0;
    for (int i=0; i<n; i++) {
        for (int j=0; j<m; j++) {
            if (b[j]%a[i]!=0) continue;
            if (b[j]/a[i]==res) ans++;
        }
    }
    printf("%d\n",ans);
}

B

TLE,これ以上オーダー落とす方法がわからない

#include <cstdio>
#include <algorithm>
#define eps 1e-6
using namespace std;
int n, m, k, a, b;
int x[5000], y[5000], z[5000];
int xx[5000];
bool C(double mid) {
    for (int i=0; i<m; i++) {
        for (int j=0; j<k; j++) {
            double r=mid*mid*(y[i]*b+z[j]*a)/(y[i]*b);
            if (r<=xx[n-1]) return true;
        }
    }
    return false;
}
int main() {
    scanf("%d",&n);
    for (int i=0; i<n; i++) {
        scanf("%d",&x[i]);
        xx[i]=x[i]*x[i];
    }
    sort(xx, xx+n);
    scanf("%d",&m);
    for (int i=0; i<m; i++) scanf("%d",&y[i]);
    scanf("%d",&k);
    for (int i=0; i<k; i++) scanf("%d",&z[i]);
    scanf("%d%d",&a,&b);
    double lb=0.0, ub=5000.0;
    for (int i=0; i<1000; i++) {
        double mid=(lb+ub)/2;
        if (C(mid)) lb=mid;
        else ub=mid;
    }
    printf("%.12f\n",lb);
}