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

传送门:It's bertrand paradox. Again!

标签:随机

题目大意

有两个人分别用两种方式在二维平面上随机生成1e5个圆,每个圆上的每一个点(x,y)都满足-100<x<100且-100<y<100,现在将某个人生成的1e5个圆的圆心和半径告诉你,问你这个人是谁。两个人生成圆的方式分别为:(1)1、随机等概率地从开区间(-100,100)生成两个整数x,y。

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<x,y<100,0<r<100),分别代表圆心的坐标和半径。

输出:如果这些圆是第一个人生成的,输出"bit-noob",否则输出"buaa-noob"。

算法分析

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

代码实现

复制代码
#include <iostream>
using namespace std;
#include <algorithm>
#include <cstring>
#include <map>
#include <iomanip>
#include <cmath>
map<pair<long long,long long>,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";
}
相关推荐
xxwxx__2 小时前
C++ STL set 与 map 全套详解:关联式容器、红黑树底层、代码坑点、刷题实战
数据结构·c++
j7~4 小时前
【Linux网络加餐】(篇六)网络版计算器(上):模板方法模式、序列化与 JSON
linux·c++·json·序列化·反序列化·网络版计算机
weixin_307779134 小时前
C++代码实现MATLAB中的ode45函数功能
开发语言·c++·算法·matlab
张小姐的猫4 小时前
【AI大模型接入SDK】 —— 数据管理 & 与Session模块进行联动
数据结构·数据库·c++·人工智能·python·chatgpt
東隅已逝,桑榆非晚5 小时前
vector(模拟实现)
c++·笔记·学习
蒸蒸yyyyzwd5 小时前
cpp 选手备战秋招学习笔记 day36
c++
用户69586106727116 小时前
从源码到加载器:__attribute__((constructor)) / __attribute__((destructor))的跨平台实现原理详解
c++
余额瞒着我当琳7 小时前
C++多态深入解析:多态概念,多态实现条件,虚函数表与内存分布,常见问题及注意事项
c++·算法
ocean21037 小时前
2025-2026年C++专题大厂面试高频问题
开发语言·c++·面试
程序猿编码7 小时前
扔掉 Python!纯 C++ 本地跑扩散 TTS,GGML 加持,支持 RK3588 NPU 加速
c++·计算机视觉·大模型·transformer·rk3588·推理·ggml