Loading

C. Going Home(数学)

Link

两个数相加最大是5e6 先粗略地想如果暴力找发现某个和出现了两次 那么就有可能存在两对数相加相等(a+b=c+d) 但是可能存在a+b=a+c这种情况 这时考虑一下有哪几种情况 再来一对 可能是a+d b+c b+d c+d这四种可能 其中b+d和已有的a+c互异以及c+d和已有的a+b互异那么一定存在两对数相加相等 现在只要考虑放入a+d和b+c的情况 如果只放入其中一个 只能得出三个数相等 如果两个都加进去 那么就能得出四个数相等(自然有两对数相加相等) 所以最坏的情况就是同一个和出现四次时,一定存在两对数相加相等 既然两对数相加的和只有5e6种情况 然后再乘以4 也就是2e7 也就是说暴力枚举2e7次必定能得到答案 因此可以暴力枚举

code

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define pb push_back

const int N = 200005;
int n;
int a[N],x[5000005],y[5000005];
int main()
{
	ios::sync_with_stdio(false);

	cin>>n;
	for(int i=1;i<=n;i++) cin>>a[i];
	for(int i=1;i<=n;i++)
	{
		for(int j=i+1;j<=n;j++)
		{
			int v = a[i]+a[j];
			if(x[v]&&y[v]&&x[v]!=i&&x[v]!=j&&y[v]!=i&&y[v]!=j)
			{
				cout<<"YES"<<endl;
				cout<<x[v]<<" "<<y[v]<<" "<<i<<" "<<j;
				return 0;
			}
			x[v]=i,y[v]=j;
		}
	}
	cout<<"NO";
}
posted @ 2021-03-14 22:00  金木换  阅读(169)  评论(0)    收藏  举报