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 }
时间: 2024-12-14 18:05:22

Uva 4916 Selling Cells(随机算法)的相关文章

Miller_Rabin算法(随机算法,判断一个数是否是素数)

1 const int S = 20;//随机算法判定次数,S越大,判错概率越小 2 LL pow_mod(LL a, LL b, LL mod) { // a^b%mod 3 LL ans = 1; 4 a = a % mod; 5 while(b) { 6 if(b & 1) { 7 ans = (ans * a) % mod; 8 } 9 a = ( a * a ) % mod; 10 b >>= 1; 11 } 12 return ans; 13 } 14 bool check

POJ 3318:Matrix Multiplication(随机算法)

http://poj.org/problem?id=3318 题意:问A和B两个矩阵相乘能否等于C. 思路:题目明确说出(n^3)的算法不能过,但是通过各种常数优化还是能过的. 这里的随机算法指的是随机枚举矩阵C的一个位置,然后通过A*B计算是否能够得到矩阵C相应位置的数,如果不等,就直接退出了,如果跑过一定的数量后能够相等,那么就可以判断这个矩阵C等于A*B的.第一次见这样的题目...有点新奇. 暴力算法: 1 #include <cstdio> 2 using namespace std;

微信红包随机算法

最近看了一篇文章,讲微信红包随机算法的.感觉很不错,所以自己实现了下,并进行了简单测试. 算法 算法很简单,不是提前算好,而是抢红包时计算: 红包里的金额怎么算?为什么出现各个红包金额相差很大?答:随机,额度在0.01和剩余平均值*2之间. 实现 实现上述算法的逻辑主要是: public static double getRandomMoney(RedPackage _redPackage) { // remainSize 剩余的红包数量 // remainMoney 剩余的钱 if (_red

加权随机算法

加权随机算法一般应用在以下场景:有一个集合S,里面比如有A,B,C,D这四项.这时我们想随机从中抽取一项,但是抽取的概率不同,比如我们希望抽到A的概率是50%,抽到B和C的概率是20%,D的概率是10%.一般来说,我们可以给各项附一个权重,抽取的概率正比于这个权重.那么上述集合就成了: {A:5,B:2,C:2,D:1} 方法一: 扩展这个集合,使每一项出现的次数与其权重正相关.在上述例子这个集合扩展成:{A,A,A,A,A,B,B,C,C,D}然后就可以用均匀随机算法来从中选取. 好处:选取的

权重随机算法的java实现

一.概述 平时,经常会遇到权重随机算法,从不同权重的N个元素中随机选择一个,并使得总体选择结果是按照权重分布的.如广告投放.负载均衡等. 如有4个元素A.B.C.D,权重分别为1.2.3.4,随机结果中A:B:C:D的比例要为1:2:3:4. 总体思路:累加每个元素的权重A(1)-B(3)-C(6)-D(10),则4个元素的的权重管辖区间分别为[0,1).[1,3).[3,6).[6,10).然后随机出一个[0,10)之间的随机数.落在哪个区间,则该区间之后的元素即为按权重命中的元素. 实现方法

随机算法 - HNU 13348 Finding Lines

Finding Lines Problem's Link: http://acm.hnu.cn/online/?action=problem&type=show&id=13348&courseid=0 Mean: 给你平面上1e5个点,让你判断是否可以找到一条直线,使得p%的点都在这条直线上. analyse: 经典的随机算法题. 每次随机出两个点,然后对n个点进行判断,看是否有p%的点在这条直线上. 关于随机算法正确性的证明: 每次随机一个点,这个点在直线上的概率是p,p最小为2

由抽奖软件想到的随机算法总结

整整三年没更新博客了,今天和女友聊天,聊到了博客,就回来看看. 最近接触到抽奖软件,下载的源码是http://download.csdn.net/detail/ghz_sd/6918125,在这里为开源软件作出贡献的人致敬,这个软件的作者a米山,是个非常好的人,耐心的帮我调试,他的算法很简单,就是纯粹的random,用的rand()函数,我给他提了个需求,写一个作弊类,实现的功能是:指定人的中奖概率提高,配置文件类似于这样: <xml> <win> <name='a' pro

中科院随机算法课程(孙晓明主讲)topic list

如题,列出<随机算法>课程的topic list,以记录和供有兴趣的朋友研究. Lession1:生日悖论.生日攻击.两个常用数学工具(马尔科夫不等式.切比雪夫不等式) Lession2:radom quick sort(hw).矩阵乘法判定.min(max())=max(min()).复杂性类(BPP/RP/CORP/ZPP) Lession3:证明BPP2/3=BPP0.99.ZPP<=RP^CORP.Game Tree Lession4:Balls and Bins Lession

歌曲播放的随机算法的探讨

对于音乐播放,最流行的有顺序播放,顺序循环播放,随机播放,单曲播放四种选项. 首先我以个人观点点评下目前常用的四种功能: 顺序播放:是一种很鸡肋的功能,为什么各大厂商都要做!感觉一般人都不会用的,播放一遍就停了,还不如做一个定时/定数停止播放的功能: 顺序循环播放:使用体验很不错,但是有个比较糟糕的问题是,让两首不相关的作品间产生了联系,导致了一首歌放完了,就已经知道了下首歌是什么了.或者当在其他地方听到了一首歌完了,脑中便浮现了自己音乐列表的下首歌了: 单曲播放:这个选项没什么可说的,动听歌曲