【牛客】寒假训练营1 I-It‘s bertrand paradox. Again! 题解

传送门:It’s bertrand paradox. Again!
标签:随机

题目大意

有两个人分别用两种方式在二维平面上随机生成1e5个圆,每个圆上的每一个点(x,y)都满足-100 2、随机等概率地从闭区间[1,100]中生成一个r。3、判断(x,y )为圆心、r为半径的圆是否满足要求,若不满足,返回步骤2重新生成r,若满足,则将该圆加入到结果中。(2)1、随机等概率地从开区间(-100,100)生成两个整数x,y,随机等概率地从闭区间[1,100]中生成一个r。2、判断(x, y)为圆心、r为半径的圆是否满足要求,若不满足,返回步骤1重新生成x,y,r,若满足,则将该圆加入到结果中。
输入:第一行一个正整数n=1e5,代表圆的总数。接下来n行每行三个整数x,y,r(-100 输出:如果这些圆是第一个人生成的,输出“bit-noob”,否则输出“buaa-noob”。

算法分析

  • 显然这题跟随机有关,我们只要暴力跑100个数据找规律就行了(不是)。好吧看来并不需要,因为这题实在太简单了。我们先看两种生成方法有什么区别,最明显的就是第一种方法要三步而第二种方法只要两步。观察多出来的一步我们会发现,第一种方法的圆心和半径是分开生成的,而第二种方法的圆心和半径是在同一步中同时生成的。
  • 因为两种方法都是随机的,所以都有可能生成不符合要求的圆。遇到这种情况,第一个人将半径重新生成直到圆符合要求,第二个人则是将整个圆重新生成,即圆心坐标和半径都替换。那么很容易看出,第一个人生成的所有的圆的圆心坐标都是一次确定的,只通过半径来调整圆的大小。所以他生成的1e5个圆的圆心位置是均匀分布在(-100,100)中的,这种情况下一些靠近边缘的圆的半径一定很小。
  • 第二种方法每次都生成一个圆心坐标、半径都随机的圆形,那么我们可以大胆地将每个圆半径都假设为其期望,再思考圆心的位置。半径为50的情况下,能符合条件的圆的圆心一定更靠近(0,0)。所以根据统计学的知识,两种方法生成的圆的圆心到(0,0)的距离的平均值一定不同,且第二种方法距离更小。
  • 那很显然存在一个标准值,如果圆心到原点的距离大于这个值就是第一种方法生成的,否则就是第二种方法生成的。要猜这个值也很简单,因为圆心在均匀分布的条件下到原点的距离期望是50根号2,也就是大概70左右,如果比这个值小很多那肯定是第二种方法生成的。保守估计在1e5的数据量下平均值不会比期望偏差超过10,故将标准值定为60。

代码实现

#include 
using namespace std;
#include 
#include 
#include 
#include 
#include 
map,bool> mp;
long long n,m,T;
int ans;
int main(){
	long long i,j,l,r,x,y,c,d,h,w,mid,t,sum=0;
	ios::sync_with_stdio(false);
	cin.tie(0);cout.tie(0);
	cin>>n;
	for(i=1;i<=n;i++){
		cin>>x>>y>>c;
		sum+=sqrt(x*x+y*y);
	}
	sum/=n;
	if(sum<60)cout<<"buaa-noob";
	else cout<<"bit-noob";
}

你可能感兴趣的:(牛客题解,c++)