题解:CF2038C DIY

WangYongkai__AFO

2024-11-19 07:45:38

Solution

本人第一篇题解

Solution:

首先我们简化一下题意,其实题目求得就是在给定的 n 个数中能否选出 8 个数作为矩形四个顶点的坐标,若能则尽量是矩形面积最大,输出Yes以及四点坐标,否则输出No

赛时思路:通过手动模拟一下我们得知,给定的 n 个数中能够作为矩形四点坐标的数 x 要满足 x 的数目 \ge2 ,所以我们可以开一个 map 来计算每个数出现的次数,同时开一个 vector 将能够作为矩形顶点坐标的数 push_back 进去,如果 vector.size()<4 ,则说明给出的数无法选出满足条件的四个数,直接输出 No 。如果 vector.size()>=4 再对 vector 排序,选最小、次小、最大、次大的四个数,分别输出坐标即可。

本题坑点:

2.在计数的时候,若某个数已经出现了 2 次,在 push_back 的同时要将它对应的计数个数清零,因为会出现选择 8 个相同的数作为顶点坐标的情况。

3.输出时要仔细考虑四个数的坐标关系再输出。

代码如下:

#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<stack>
#include<queue>
#include<map>
#include<vector>
#include<cstdio>
#include<set>
#include<bitset>
#include<iomanip>
#include<cstdlib>
#define int long long
using namespace std;
int T;
int n;
const int N=2e5+5;
int a[N];
vector<int>e;
signed main()
{
//    freopen(".in","r",stdin);
//    freopen(".out","w",stdout);
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    cin>>T;
    while(T--)
    {
        e.clear();
        map<int,int>vis;
        cin>>n;
        for(int i=1;i<=n;i++) 
        {
            cin>>a[i],vis[a[i]]++;
            if(vis[a[i]]==2) 
            {
                e.push_back(a[i]);
                vis[a[i]]=0;
            }
        }
        if(e.size()<4)
        {
            cout<<"No"<<'\n';
            continue;
        }
        sort(e.begin(),e.end());
        int len=e.size();
        cout<<"Yes"<<'\n';
        cout<<e[len-1]<<' '<<e[len-2]<<' '<<e[len-1]<<' '<<e[0]<<' '; 
        cout<<e[1]<<' '<<e[len-2]<<' '<<e[1]<<' '<<e[0]<<'\n';
    }
     return 0;
}