题目大意:
t个测试样例,每个样例n个数,找四个数组成的矩形使周长的平方对面积的商结果最小,输出这四个数(就是长和宽)。
解题思路:
推这个关系可以发现如果长宽相同那么结果就是最小的,否则的话两个数差值越小并且本身越大结果就越小。
#include<iostream>
#include<cstdio>
#include<fstream>
#include<set>
#include<cmath>
#include<cstring>
#include<string>
#include<map>
#include<vector>
#include<iomanip>
#include<cstdlib>
#include<list>
#include<queue>
#include<stack>
#include<algorithm>
#define inf 0x3f3f3f3f
#define MOD 1000000007
#define mem0(a) memset(a,0,sizeof(a))
#define mem1(a) memset(a,-1,sizeof(a))
#define meminf(a) memset(a,inf,sizeof(a))
#define HASHP 13331;
// set<int>::iterator it;
typedef long long ll;
typedef unsigned long long ull;
using namespace std;
int main()
{
std::ios::sync_with_stdio(false);
cin.tie(0);
//freopen("test.txt","r",stdin);
//freopen("output.txt","w",stdout);
int t;
cin>>t;
while(t--)
{
vector<int> stick;//存放可以作为长宽的木棒
int n,book[10010]={0};
int l,r;
double ma=inf;
cin>>n;
for(int i=0;i<n;i++)
{
int t;
cin>>t;
book[t]++;
if(book[t]==2||book[t]==4)stick.push_back(t);//注意条件是等于,防止放入重复的
}
sort(stick.begin(),stick.end());//从小到大排序
for(int i=stick.size()-1;i>0;i--)
{
if(book[stick[i]]<4)
{
double bi=(stick[i]*1.0)/(stick[i-1]*1.0)+(stick[i-1]*1.0)/(stick[i]*1.0);//化解后的判断结果
if(bi<ma)//更新最小值
{
ma=bi;
l=stick[i];
r=stick[i-1];
}
}
else
{
l=stick[i];
r=stick[i];
break;
}
}
cout<<l<<' '<<l<<' '<<r<<' '<<r<<endl;
}
return 0;
}
疯狂TLE的一个题,对于木棒存放哪里我又加入了一个map标记,当时没想到==2或者==4就可以不重复的存放。思维能力还是很差劲啊。