C. Minimum Value Rectangle

http://codeforces.com/contest/1027/problem/C

题意:题意:给出n根木棍的长度,求从中选择4根,能组成最小的(周长的平方/面积)的值的4根的长度。

化简之后就是求x/y+y/x的最小值。

输入输出的时候用scanf(),printf()。set<type>s,s.begin()返回的是iterator;

#include<bits/stdc++.h>
#define inf 0x3f3f3f3f
#define maxn 1000005
using namespace std;
map<int,int>vis;
set<int>s;
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        vis.clear();
        s.clear();
        int n,temp,flag=0;
        scanf("%d",&n);
        for(int i=0;i<n;i++)
        {
            scanf("%d",&temp);
            vis[temp]++;
            if(vis[temp]>=2) s.insert(temp);
            if(vis[temp]>=4) flag=temp;
        }
       
        if(s.size()==1)
        {
            for(int i=0;i<4;i++)
                printf("%d ",*s.begin());
                printf("\n");
        }
        else if(flag)
        {
            for(int i=0;i<4;i++)
                printf("%d ",flag);
                printf("\n");
        }
        else
        {
            double ans=inf;
            int h,w,hh,ww;
            h=*s.begin();
            s.erase(s.begin());
            while(!s.empty())
            {
                int w=*s.begin();s.erase(s.begin());
                double temp=1.0*w/h+1.0*h/w;
                if(ans>temp)
                {
                    ans=temp;
                    hh=h;
                    ww=w;
                }
                h=w;
            }
            printf("%d %d %d %d\n",hh,hh,ww,ww);
        }
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_38924883/article/details/81867337