!HDU 4145--思维(yy题)--(细节)

题意:有两个中心点A,B,有其他n个点,每个点到中心点都有以它们的距离为半径的圆的辐射范围,求最小的辐射范围半径能覆盖所有的点。

分析:这题纯靠想解题方法。一开始方向走错了一直WA。开始的想法:每输入一个点就计算它到A,B的距离,只取较小值,不断更新结果。WA的过程中才慢慢发现这样做会有很多特殊情况,但当时都没想过要换思路,只是不断地增加代码讨论情况,下次一定记得发现方法有很多不足就转换思路。正确做法:每输入一个点只计算它到A点的距离,从大到小排序,遍历依次判断加入把这一点归到B的覆盖范围是否结果会更小,不断更新答案。后来又WA了几遍,原因:中间当判断出一个点若归为B的范围时不能更新答案就break退出循环,这是错误的,应该要遍历完。

代码:

#include<iostream>
#include<algorithm>
using namespace std;
struct h{
	long long x,y;
	long long dis;
}a[100008];
long long dd,dis,tmp;
bool cmp(h a,h b)
{
	return a.dis>b.dis;
}
int main()
{
	int t,n,x2,x3,y2,y3,x,y;
	cin>>t;
	while(t--){
		cin>>x2>>y2>>x3>>y3;
		cin>>n;
		for(int i=0;i<n;i++){
			cin>>x>>y;
			a[i].x=x,a[i].y=y;
			a[i].dis=(x-x2)*(x-x2)+(y-y2)*(y-y2);
		}
		sort(a,a+n,cmp);
		a[n].dis=0;
		dd=a[0].dis,dis=0;
		for(int i=0;i<n;i++){
			tmp=(a[i].x-x3)*(a[i].x-x3)+(a[i].y-y3)*(a[i].y-y3);
			if(dis<tmp)
			   dis=tmp;
			if(dis+a[i+1].dis<=dd)
			   dd=dis+a[i+1].dis;
		//	else break;思路对了以后还是WA的原因
		}
		cout<<dd<<endl;
	}
}
时间: 2024-10-29 19:09:56

!HDU 4145--思维(yy题)--(细节)的相关文章

hdu 4932 /bestcoder B题 #4 /思维题

题意:给一个数列(整数),用一些不相交的区间去覆盖(只能是用端点去覆盖,端点可以交).而且区间出度相等.求最大区间长度. 开始一下就敲了,枚举每个区间长度,判断合法,更新最大.但是后来一看小数,感觉不行,改为二分,后来还是挂了... 赛后才知道,二分的时候,答案必需要满足单调性啊,这里小的数据不行,大的数据可以行!如 0 1 5 6 10, 3不行,4行. 后来才知道,枚举时,每个差值的一半也是可以的:仔细想想很容易证明.(水,坑) #include<iostream> #include<

hdu 4883 思维题

链接:http://acm.hdu.edu.cn/showproblem.php?pid=4883 TIANKENG’s restaurant Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/Others)Total Submission(s): 566    Accepted Submission(s): 267 Problem Description TIANKENG manages a

Saving Princess claire_(hdu 4308 bfs模板题)

http://acm.hdu.edu.cn/showproblem.php?pid=4308 Saving Princess claire_ Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 2305    Accepted Submission(s): 822 Problem Description Princess claire_ wa

HDU 2092 整数解 --- 水题

x+y = n, x*y = m; y = n - x; x * ( n - x) = m nx - x^2 = m; x^2 - nx + m = 0; △ = sqrt(n^2 - 4m) 要有整数解即△需要为可开方数即可. /* HDU 2092 整数解 --- 水题 */ #include <cstdio> #include <cmath> int main() { double n, m; while (scanf("%lf%lf", &n,

HDU 4279 Number 规律题

题意: 定义函数F(x) : 区间[1,x]上的y是满足:GCD(x,y)>1 && x%y>0的 y的个数. 问:对于任意区间[l,r] 上的F(l···r) 有几个函数值是奇数的. 打表找规律. 打的是[1,x]区间的结果 把所有结果不相同的值打出来(因为结果是递增的,所以只观察不相同的结果) 发现:ans = x/2-2 || x/2-1 再把所有结果不同 && x/2-1的值打出来 发现 sqrt(x) &1 == 1 得到:ans = x/2-

hdu 4961 数学杂题

http://acm.hdu.edu.cn/showproblem.php?pid=4961 先贴个O(nsqrtn)求1-n所有数的所有约数的代码: vector<int>divs[MAXN]; void caldivs() { for(int i=1;i<MAXN;i++) for(int j=i;j<MAXN;j+=i) divs[j].push_back(i); } 有了这个当时理下思路就可写了,但是重复数处理注意: 1.用一个数组vis[]  vis[i]=1表示i存在

HDU Multiplication table 阅读题

链接:http://acm.hdu.edu.cn/showproblem.php?pid=4951 题意:给一个P进制的乘法表,行和列分别代表0~p-1,第i行第j*2+1和第j*2+2列代表的是第i行的数x和第j列的数的乘积,不过这个乘法表被人弄乱了,原来的0~p-1被映射到了一个新的0~p-1的permutation(以前在CF上看见的permutation表示1~P,所以稍有迷茫),分别代表了新的不同的数,乘法表上的数也都被映射了.现在要找出映射到了什么新的数. 思路:毫无疑问,出现最多的

hdu 1711 KMP模板题

// hdu 1711 KMP模板题 // 贴个KMP模板吧~~~ #include <cstdio> #include <cstring> #include <algorithm> #include <iostream> using namespace std; const int MAX_N = 1000008; const int MAX_M = 10008; int T[MAX_N]; int p[MAX_M]; int f[MAX_M]; int

hdu 2586 LCA模板题(离线算法)

http://acm.hdu.edu.cn/showproblem.php?pid=2586 Problem Description There are n houses in the village and some bidirectional roads connecting them. Every day peole always like to ask like this "How far is it if I want to go from house A to house B&quo

HDU-1037-Keep on Truckin&#39;(HDU最水的题没有之一,为了练英语就来吧)

Keep on Truckin' Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 10324    Accepted Submission(s): 7147 Problem Description Boudreaux and Thibodeaux are on the road again . . . "Boudreaux, we ha