Uva 4916 Selling Cells(随机算法)

Posted Neord

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Uva 4916 Selling Cells(随机算法)相关的知识,希望对你有一定的参考价值。

题意:

给定n个圆的 坐标 和半径, 求第一个圆与其他圆相交的面积占第一个圆的面积的多大。

分析:

如果从局部去想, 处理每个圆之间的关系, 求出他们与第一个圆的交集, 这样可能就会十分复杂了。

不妨从总体去想, 因为答案要求的数字并不是十分精确(保留两位小数),  那么我们可以试试随机算法,

想象在第一个圆内撒绿豆, 那么绿豆肯定会落到第一个圆与其他圆相交的区域, 这时候统计一下撒的绿豆和在区域中的绿豆就可以大概算出这个数字了。

这里有个技巧是用 

rand() /(double)(RAND_MAX/‘num‘)  生成 0 ~ num 的浮点数 rand()/(double)RAND_MAX 就是生成一个0 ~ 1的浮点数
 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 const int maxn = 25 + 7;
 4 int n;
 5 
 6 double x[maxn], y[maxn], r[maxn];
 7 
 8 double p2pdis(double x1, double y1, double x2, double y2){
 9     return sqrt((x1-x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));
10 }
11 
12 int main(){
13     while(scanf("%d", &n) && n){
14         for(int i = 0; i < n; i++){
15             scanf("%lf %lf %lf\n", &x[i], &y[i], &r[i]);
16         }
17         int time = 2e5;//设置最多循环次数, 在不超时的情况下设置的越大越好
18         int in = 0, tot = 0;
19         while(time--){
20             double tx,ty;
21             tx = x[0] + rand() /(double)(RAND_MAX/ (-2 * r[0])) + r[0]; // 令tx在x的半径内随机
22             ty = y[0] + rand() /(double)(RAND_MAX/(-2 * r[0]))  + r[0]; // 令ty在y的半径内随机
23             if(p2pdis(tx,ty,x[0],y[0]) < r[0]){//此时还要判断一下这个点,是否在圆内, 因为我们是在以圆点为中心的正方形内取点
24                 tot++;//判断多少个点符合
25                 for(int i = 1; i < n; i++){
26                     if(p2pdis(tx,ty,x[i],y[i]) <= r[i]){
27                         in++;//判断多少个点在小圆内
28                         break;
29                     }
30                 }
31             }
32         }
33         printf("%.2f\n",(double)in/tot);
34     }
35 }

 

以上是关于Uva 4916 Selling Cells(随机算法)的主要内容,如果未能解决你的问题,请参考以下文章

UVa 12265 - Selling Land

uva12265 Selling Land

BZOJ4375Selling Tickets 随机化

生成随机序列

Selling Souvenirs CodeForces - 808E (分类排序后DP+贪心)

Playing Office Politics Without Selling Your Soul