C++炮台实验
炮台实验
蒜头君在玩一个战争模拟游戏,他有高度为 1,2,3,... ,n的炮台各一个,他需要把这 n个炮台从左往右排成一行,并且炮口都朝向右边。
在这个游戏中,所有炮台发射的炮弹会摧毁前方所有高度比自己低的炮台。每当蒜头君把 n个炮台排成一行后,可能会有一些炮台被摧毁。举个例子:当前有 5 个炮台,从左到右高度分别为 2,1,3,5,4往右发射炮弹后,高度为 4 的炮台被高度为 5 的摧毁,高度为 1 的炮台被高度为 2 的炮台摧毁,最后只会剩下 2,3,5 这三个炮台。
现在蒜头君想知道,如果随机地摆放这 n个炮台,最后剩下炮台个数的期望是多少?比如 n=时,有两种摆放方式,高度序列分别为 1,2和 2,1,前者最后剩下 22 个炮台,后者最后剩下一个炮台,因此期望为 (2+1)\2=1.5000。
请你求出 n=201时剩下炮台个数的期望,保留四位小数。
样例输入复制
无
样例输出复制
无
题目来源
思路一(运行时间过长,失败):
创建一个数组arr[2019]之后分别赋值为1,2,3.....2019。随后用next_permutation()函数把所有的排列情况都输入一遍,之后用循环把后面小于前面的数都去掉变可以了。
代码如下:
#include <iostream>
#include <algorithm>
#include<string>
#include<cstring>
#include<cstdio>
using namespace std;
#define N 9
int main()
{
int arr[];
for (int i = ;i < N;++i)
{
arr[i] = i+;
}
double num1 = , num2 = ;
do {
bool b[] = { };
num2++;
for (int i = ;i < N;++i)
{
for (int j = i + ;j < N;++j)
{
if (arr[i] > arr[j]) b[j] = ;
}
}
for (int i = ;i < N;++i)
{
if (!b[i]) num1++;
}
} while (next_permutation(arr, arr + N));
printf("%.4f", num1/num2 );
return ;
}
运行发现之后,想法很好,但是由于循环次数很大,编译器需要大量时间,也就能算n=20左右的情况,这离2019还差很多,所以这个思路就得换了,于是产生了第二个思路。
思路二:
因为题中是求期望值,比如2019这个数,无论怎么排列2019这个数都是存在的,所以2019这个数期望值是1;2018这个数只有2019在他前面时候才能消灭它,所以2018这个数的期望值就是1/2;同理,n=2019时,只用一个循环1/i就可以解决了。
代码如下:
#include<cstdio>
#include<iostream>
using namespace std;
int main()
{
double num = ;
int n = ;
for (int i = ; i <= n; i++) {
num += 1.0 / i;
}
printf("%.4f\n", num);
return ;
}
C++炮台实验的更多相关文章
- [原] 利用 OVS 建立 VxLAN 虚拟网络实验
OVS 配置 VxLAN HOST A ------------------------------------------ | zh-veth0(10.1.1.1) VM A | | ---|--- ...
- Android中Activity的四大启动模式实验简述
作为Android四大组件之一,Activity可以说是最基本也是最常见的组件,它提供了一个显示界面,从而实现与用户的交互,作为初学者,必须熟练掌握.今天我们就来通过实验演示,来帮助大家理解Activ ...
- SEED实验系列文章目录
美国雪城大学SEEDLabs实验列表 SEEDLabs是一套完整的信息安全实验,涵盖本科信息安全教学中的大部分基本原理.项目组2002年由杜文亮教授创建,目前开发了30个实验,几百所大学已采用.实验楼 ...
- 物联网实验4 alljoyn物联网实验之手机局域网控制设备
AllJoyn开源物联网协议框架,官方描述是一个能够使连接设备之间进行互操作的通用软件框架和系统服务核心集,也是一个跨制造商来创建动态近端网络的软件应用.高通已经将该项目捐赠给了一个名为“AllSee ...
- (转)linux下和云端通讯的例程, ubuntu和openwrt实验成功(一)
一. HTTP请求的数据流总结#上传数据, yeelink的数据流如下POST /v1.0/device/4420/sensor/9089/datapoints HTTP/1.1Host: api. ...
- (原创) alljoyn物联网实验之手机局域网控制设备
AllJoyn开源物联网协议框架,官方描述是一个能够使连接设备之间进行互操作的通用软件框架和系统服务核心集,也是一个跨制造商来创建动态近端网络的软件应用.高通已经将该项目捐赠给了一个名为“AllSee ...
- 实验:Oracle直接拷贝物理存储文件迁移
实验目的:Oracle直接拷贝物理文件迁移,生产库有类似施工需求,故在实验环境简单验证一下. 实验环境: A主机:192.168.1.200 Solaris10 + Oracle 11.2.0.1 B ...
- Oracle RAC 更换存储实验
实验环境准备: RHEL 6.5 + Oracle 11.2.0.4 RAC (2nodes) OCR和Voting Disk使用的是OCR1磁盘组,底层对应3个1G大小的共享LUN,一般冗余: DA ...
- Vertica集群扩容实验过程记录
需求: 将3个节点的Vertica集群扩容,额外增加3个节点,即扩展到6个节点的Vertica集群. 实验环境: RHEL 6.5 + Vertica 7.2.2-2 步骤: 1.三节点Vertica ...
随机推荐
- Java继承之面向对象
面向对象与面向过程: 面向对象(OOP)与面向过程 二者都是一种思想,面向对象是相对于面向过程而言的. 面向过程,强调的是功能行为.面向对象,将功能封装进对象,强调具备了功能的对象. 面向对象更加强调 ...
- flask中url_for使用endpoint和视图函数名
在flask中,使用url_for 进行路由反转时,需要传递一个endpoint的值,用法如下: @app.route('/', endpoint='my_index') def index(): r ...
- python函数里引用全局变量
python在引用变量的时候尤其要注意变量的作用域,在函数里引用不可变类型变量的时候,函数执行结束后是不会改变全局变量的值的:若想在函数里改变不可变类型全局变量的值时,引用的时候要用”global a ...
- Aliyun Linux2安装Docker
安装教程 使用手册
- 02_Linux实操篇
第五章 VI和VIM编辑器 5.1. VI和VIM基本介绍 Vi编辑器是所有Unix及Linux系统下标准的编辑器,它的强大不逊色于任何最新的文本编辑器.由于对Unix及Linux系统的任何版本,Vi ...
- Linux最常用的基本操作复习
.ctrl + shift + = 放大终端字体 .ctrl + - 缩小终端字体 .ls 查看当前文件夹下的内容 .pwd 查看当前所在的文件夹 .cd 目录名 切换文件夹 .touch 如果文件不 ...
- pandas_学习的时候总会忘了的知识点
对Series 对象使用匿名函数 使用 pipe 函数对 Series 对象使用 匿名函数 pd.Series(range(5)).pipe(lambda x,y,z :(x**y)%z,2,5) p ...
- 5073 [Lydsy1710月赛]小A的咒语
LINK:[Lydsy1710月赛]小A的咒语 每次给定两个串 要求从a串中选出x段拼成B串 能否做到.T组数据. \(n\leq 100000,m\leq 100000,T\leq 10,x\leq ...
- 剑指 Offer 58 - I. 翻转单词顺序
本题 题目链接 题目描述 我的题解 方法一:库函数split() 要注意str.split()函数: 字符串str前有 n 个空格时,分割出来的字符串列表中会多出 n 个空字符串: 字符串str某两个 ...
- linux的软件管理的rpm包和yum配置加tar解压包和安装编译./configuer
软件管理 rpm包 和yum 1.软件形式 Linux系统的第三方软件,无论是应用软件还是工具软件,大多以以下两种形式之一发行: 源代码形式 预编译形式 获取的源代码形式的软件,需要对其 ...