高效算法设计专项:LA 4356
2013-07-08 23:50
176 查看
刚开始一直以为O(n^2)过不了,后来发现原来还挺快的。就是枚举扇形的周长,然后扫一遍,找出以该周长覆盖k个点所需的最小角度,更新最小值即可。
#include <iostream> #include <cstdio> #include <algorithm> #include <cmath> using namespace std; const double eps=1e-6; const double pi=acos(-1.0); const int maxn=5010; int dcmp(double x) { if(fabs(x)<eps) return 0; else return x<0?-1:1; } int n,k; struct point { int x,y; double ang; double len; point(int x=0,int y=0):x(x),y(y) { ang=atan2(y,x); len=sqrt(x*x+y*y); } bool operator<(const point& tmp) const { return dcmp(ang-tmp.ang)<0; } } p[2*maxn]; int a[2*maxn],m; int main() { int kase=1; while(~scanf("%d%d",&n,&k)) { if(!n&&!k) break; for(int i=0;i<n;i++) { int x,y; scanf("%d%d",&x,&y); p[i]=point(x,y); } sort(p,p+n); for(int i=n;i<2*n;i++) p[i]=p[i-n]; double ans=1e10; for(int i=0;i<n;i++) { double r=p[i].len; m=0; for(int j=0;j<2*n;j++) if(dcmp(p[j].len-r)<=0) a[m++]=j; for(int j=0;j<m-k+1;j++) { if(a[j+k-1]-a[j]>=n||a[j]>=n) break; double angle=p[a[j+k-1]].ang-p[a[j]].ang; if(a[j+k-1]>=n) angle+=2*pi; ans=min(ans,r*r*angle/2); } } printf("Case #%d: %.2f\n",kase++,ans); } return 0; }
相关文章推荐
- 高效算法设计专项:LA 2963
- 高效算法设计专项:LA 4726
- 高效算法设计专项:LA 2689
- 高效算法设计专项:UVa 11572
- 高效算法设计专项:UVa 10125
- SEERC 2006 Subsequence, 高效算法设计 ,LA 2678
- 高效算法设计专项:UVa 10810
- 高效算法设计专项:UVa 10827
- 高效算法设计专项:UVa 10535
- 高效算法设计专项:UVa 10730
- 高效算法设计专项:UVa 11054
- 高效算法设计专项:UVa 10391
- 高效算法设计专项:UVa 10691
- A、B两个整数集合,设计一个算法求他们的交集,尽可能的高效。
- 集训第四周(高效算法设计)A题 Ultra-QuickSort
- 集训第四周(高效算法设计)C题 (二分查找优化题)
- 集训第四周(高效算法设计)I题 (贪心)
- 【高效算法设计——递归】 UVa 12627 Erratic Expansion
- 紫书_第八章_高效算法设计_8.3.1——棋盘覆盖问题
- 算法竞赛入门经典:第八章 高效算法设计 8.2归并排序