codeforces round49 div2 C. Minimum Value Rectangle

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/A7_RIPPER/article/details/81873267

这里写图片描述这里写图片描述

题目大意:

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就可以不重复的存放。思维能力还是很差劲啊。

猜你喜欢

转载自blog.csdn.net/A7_RIPPER/article/details/81873267