我的想法是比较相同y值的所有点的平均值
但是还有更加简单的想法,即若两点满足1.x轴的和为对称轴的2倍 2. y轴相等, 那么这两个点对称,然后再直接认为x最小+x最大的两倍就是对称轴的两倍。
我的想法
#include<bits/stdc++.h>
using namespace std;
int main(void)
{
int T;
scanf("%d",&T);
while(T--)//每一次处理,输出一个结果
{
int num[20005]={0},ct[20005]={0};
int n;
scanf("%d",&n);
for(int i=0;i<n;i++)
{
int x,y;
scanf("%d %d",&x,&y);
num[y+10000]+=x;
ct[y+10000]++;
}
float temp=0;//储存中心轴线的X坐标
int i,first=1;
for ( i=0;i<20005;i++)
{
if(ct[i]!=0)
{
printf("%d ",num[i]);
if(first)
{
first=0;
temp=num[i]*1.0/ct[i];
}
else
if(temp==num[i]*1.0/ct[i])
{
temp=num[i]*1.0/ct[i];
}
else
break;
}
}
if(i>20000)
{
printf("YES\n");
}
else
{
printf("NO\n");
}
}
return 0;
}
此为简单办法
#include <bits/stdc++.h>
using namespace std;
const int N = 1005;
int x[N], y[N], n, mx;
bool have(int i)
{
for(int j = 0; j < n; ++j)
if(y[i] == y[j] && x[i] + x[j] == 2 * mx) return true;
return false;
}
int main()
{
int cas, lx, rx, a, i;
scanf("%d", &cas);
while(cas--)
{
lx = rx = 0;
scanf("%d", &n);
for(i = 0; i < n; ++i)
{
scanf("%d%d", &a, &y[i]);
x[i] = a * 2;
if(x[i] < x[lx]) lx = i;
if(x[i] > x[rx]) rx = i;
}
mx = (x[lx] + x[rx]) / 2;
for(i = 0; i < n; ++i)
if(!have(i)) break;
if(i >= n) puts("YES");
else puts("NO");
}
return 0;
---------------------
作者:virgoDd
来源:CSDN
原文:https://blog.csdn.net/acvay/article/details/43015507
版权声明:本文为博主原创文章,转载请附上博文链接!