版权声明:本文为博主原创文章,转载请预先通知博主(〃'▽'〃)。 https://blog.csdn.net/m0_37624640/article/details/81840876
做法:数组不要开超过1e4否则会超时……
自己真的要好好改改硬解题这个坏毛病……
我们设长和宽分别为a,b
P^2/S = (2*(a+b))^2/a*b = 4(a/b+b/a+2)
也就是说当a/b+b/a 最小的时候,P^2/S 最小,然后简单贪心处理一下就好了。
坑点就在数组开太大,就会超时 ORZ
AC代码:
#include<bits/stdc++.h>
#define rep(i,s,t) for(int i = (int)(s); i <= (int)(t); i++)
#define rev(i,t,s) for(int i = (int)(t); i >= (int)(s); i--)
#define pb(x) push_back(x)
#define all(x) x.begin(),x.end()
#define sz(x) (int)(x).size()
using namespace std;
typedef long long ll;
const int mod = 1e9+7;
const double PI = 4*atan(1.0);
const int maxn = 1e4+5;
const int INF = 0x3f3f3f3f;
int e[maxn];
int vis[maxn];
inline int read()
{
char x;
while((x = getchar())<'0' || x>'9');
int u = x-'0';
while((x = getchar())>='0' && x<='9') u = (u<<3)+(u<<1)+x-'0';
return u;
}
int main()
{
#ifdef LOCAL_FILE
freopen("in.txt","r",stdin);
#endif // LOCAL_FILE
int t;
t = read();
while(t--)
{
memset(e,0,sizeof(e));
memset(vis,0,sizeof(vis));
int n,d;
int flag = 1;
n = read();
int k=0;
for(int i=0;i<n;i++)
{
d = read();
vis[d]++;
if(vis[d] == 4 && flag)
{
printf("%d %d %d %d\n",d,d,d,d);
flag = 0;
}
if(vis[d] == 2 && flag)
e[k++] = d;
}
if(flag)
{
sort(e,e+k);
double mmin = INF;
int ans1,ans2;
for(int i=0;i<k-1;i++)
{
double tmp = (double)e[i]/e[i+1]+(double)e[i+1]/e[i];
if(tmp<mmin)
{
mmin = tmp;
ans1 = e[i];
ans2 = e[i+1];
}
}
printf("%d %d %d %d\n",ans1,ans1,ans2,ans2);
}
}
return 0;
}