【2错笔记】回旋星空——妙用排序

原题传送:

回旋星空——妙用排序


再错分析:

对这题印象挺深刻的,觉得应该再刷没问题,结果还是败了,想到用排序,但在整理距离的数据时就全乱套了,尤其是这一部分

for ( i=1; i<=n; i++ )
		{
			cnt = 1;
			memset ( dis, 0, sizeof(dis) );
			for ( j=1; j<=n; j++ )
			{
				dis[cnt] = distance(a[i].x,a[j].x,a[i].y,a[j].y);
				cnt++;
			}

首先是犯了老毛病,忘记归零重置了,即

cnt = 1;
memset ( dis, 0, sizeof(dis) );

忘记了

然后就是for循环的条件了,绕了好久没绕出来,以为是冒泡的条件,即把所有两两配对的点找出来就好了,其实再好好理解下题意就直到怎么改了。

第一个i是找基准点,然后第二个j是遍历全部的点计算i与j的全部可能距离,故可能的情况要远远大于两两配对的点的情况。

还有一个十分糟心的地方就是sort函数,因为不是从0下标开始计数,又是第一次用c++的sort函数,要精确计算出排序的长度,不然结果就会有误(因为多余的数据被memset为0了)

AC代码:

#include <bits/stdc++.h>
using namespace std;

struct point{
	int x,y;
};

int distance ( int x1, int x2, int y1, int y2 ){
	return (x1-x2)*(x1-x2)+(y1-y2)*(y1-y2);
} 

int main(){
	int t,n;
	int i,j,k;
	cin >> t;
	point a[1001];
	int dis[1001];
	

	while ( t-- )
	{
		cin >> n;
		for ( i=1; i<=n; i++ )
			cin >> a[i].x >> a[i].y;
		
		int sum=0;
		int cnt=1;
		
		for ( i=1; i<=n; i++ )
		{
			cnt = 1;
			memset ( dis, 0, sizeof(dis) );
			for ( j=1; j<=n; j++ )
			{
				dis[cnt] = distance(a[i].x,a[j].x,a[i].y,a[j].y);
				cnt++;
			}
			
			sort(dis+1, dis+n+1);
			
			for ( k=1; k<=n; k++ )
				if ( dis[k] == dis[k+1] )
					sum += 2;
		}
		if ( sum==0 ) cout << "WA" << endl;
		else
			cout << sum << endl;	
	}
	return 0;

} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值