UVA 10382
2014-11-26 18:26
197 查看
题目大意是给定一个长l宽w的草坪,有n个喷水头,每个处于水平中间位置,给定其距离左边的距离和半径,求最少几个喷头可覆盖整个草坪。
形状不是我们所关心的,我们只关心喷头能完全覆盖的区间,这里完全覆盖的区间指的是覆盖区域减去两端两个小半圆后剩下的矩形区域,我们令t=sqrt(r*r-w*w/4),之后用圆心坐标加减t即可得到区间左右端位置,此时问题转化成区间覆盖问题。
形状不是我们所关心的,我们只关心喷头能完全覆盖的区间,这里完全覆盖的区间指的是覆盖区域减去两端两个小半圆后剩下的矩形区域,我们令t=sqrt(r*r-w*w/4),之后用圆心坐标加减t即可得到区间左右端位置,此时问题转化成区间覆盖问题。
#include <iostream> #include <algorithm> #include <cmath> using namespace std; struct sprinkler{ double l,r; }ss[10010]; bool cmp(struct sprinkler a,struct sprinkler b) { return a.r<b.r; } int main() { int n; double l,w; while(cin>>n>>l>>w){ int size=0,ans=0; double tw=w/2; for(int i=0;i<n;i++){ double o,r,t; cin>>o>>r; if(r<=tw) continue; t=sqrt(r*r-(tw*tw)); ss[size].l=o-t; ss[size].r=o+t; size++; } sort(ss,ss+size,cmp); double tl=0,tr=l; int p=0; while((tr-tl)>0.0000005){ while(p<size&&ss[p].r<=tl) p++; bool yes=false; double Max=-1,Maxp; for(int i=p;i<size;i++){ if(ss[i].l<=tl){ yes=true; if(ss[i].r>Max) {Maxp=i;Max=ss[i].r;} } } if(!yes) break; tl=Max;ans++; } if((tr-tl)<0.0000005) cout<<ans<<endl; else cout<<-1<<endl; } return 0; }
相关文章推荐
- UVa:10382 Watering Grass
- 10382 - Watering Grass uva贪心
- UVA 10382 - Watering Grass
- UVa 10382 - Watering Grass(贪心+区间覆盖问题)
- UVA 10382 贪心(区间覆盖)
- UVA 10382
- UVA 10382 Watering Grass
- UVA 10382 Watering Grass (贪心 + 区间覆盖问题)
- UVa 10382
- UVa 10382 Watering Grass
- uva 10382 Watering Grass(贪心)
- uva 10382 Watering Grass
- ecjtu-summer training #5 E - Watering Grass UVA - 10382
- uva 10382 Watering Grass
- Uva 10382 (区间覆盖) Watering Grass
- UVa 10382 Watering Grass (区间覆盖贪心问题+数学)
- UVA - 10382 Watering Grass 贪心
- UVA - 10382 (区间贪心)
- UVA 10382 贪心 最少圆
- UVa 10382 - Watering Grass(贪心算法)