您的位置:首页 > 其它

UVA 10382(p79)----Watering Grass

2016-03-23 22:13 363 查看
#include<bits/stdc++.h>
#define debu
using namespace std;
const int maxn=1e4+50;
struct point
{
double l,r;
bool operator < (const point& rhs) const
{
if(rhs.l==l) return rhs.r>r;
else return rhs.l>l;
}
};
int n,l,w,num;
point a[maxn];
void solve()
{
sort(a,a+num);
double left=0.0;
double right=0.0;
int flag=0,i=0,j,ans=0;
if(a[0].l<=0)
{
while(i<num)
{
j=i;
while(j<num&&a[j].l<=left)
{
if(a[j].r>right)
right=a[j].r;
j++;
}
if(i==j) break;
i=j;
ans++;
left=right;
if(left>=l)
{
flag=1;
break;
}
}
}
if(flag) printf("%d\n",ans);
else printf("%d\n",-1);
}
int main()
{
#ifdef debug
freopen("in.in","r",stdin);
#endif // debug
while(scanf("%d%d%d",&n,&l,&w)!=EOF)
{
num=0;
for(int i=0; i<n; i++)
{
int x,r;
scanf("%d%d",&x,&r);
if(r*2<w) continue;
double tmp=sqrt((double)r*r-(double)w*w/4);
a[num].l=(double)x-tmp;
a[num].r=(double)x+tmp;
num++;
}
solve();
}
return 0;
}

题目地址:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=1323

题解:圆形可覆盖的面积实际等于圆形与长方形相交所形成的矩形,长为sqrt(r*r-w*w/4)*2,宽为w。r*2<w的圆可直接舍弃。则问题转化为选择尽量少的区间,将长为l的区间覆盖。贪心:每次选取尽量像右延伸最多的区间即可。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: