当前位置: 首页 > news >正文

JLOI 2013 卡牌游戏

问题描述:

N个人坐成一圈玩游戏。一开始我们把所有玩家按顺时针从1到N编号。首先第一回合是玩家1作为庄家。每个回合庄家都会随机(即按相等的概率)从卡牌堆里选择一张卡片,假设卡片上的数字为X,则庄家首先把卡片上的数字向所有玩家展示,然后按顺时针从庄家位置数第X个人将被处决即退出游戏。然后卡片将会被放回卡牌堆里并重新洗牌。被处决的人按顺时针的下一个人将会作为下一轮的庄家。那么经过N-1轮后最后只会剩下一个人,即为本次游戏的胜者。现在你预先知道了总共有M张卡片,也知道每张卡片上的数字。现在你需要确定每个玩家胜出的概率。
这里有一个简单的例子:
例如一共有4个玩家,有四张卡片分别写着3,4,5,6.
第一回合,庄家是玩家1,假设他选择了一张写着数字5的卡片。那么按顺时针数1,2,3,4,1,最后玩家1被踢出游戏。
第二回合,庄家就是玩家1的下一个人,即玩家2.假设玩家2这次选择了一张数字6,那么2,3,4,2,3,4,玩家4被踢出游戏。
第三回合,玩家2再一次成为庄家。如果这一次玩家2再次选了6,则玩家3被踢出游戏,最后的胜者就是玩家2.

输入:第一行包括两个整数N,M分别表示玩家个数和卡牌总数。
接下来一行是包含M个整数,分别给出每张卡片上写的数字。

输出:
输出一行包含N个百分比形式给出的实数,四舍五入到两位小数。分别给出从玩家1到玩家N的胜出概率,每个概率之间用空格隔开。
输入输出样例:
game.in game.out
5 5
2 3 5 7 11 22.72% 17.12% 15.36% 25.44% 19.36%

数据范围:
对于20%的数据,有1<=N<=10 1<=M<=50 1<=每张卡片上的数字<=50
对于40%的数据,有1<=N<=30 1<=M<=50 1<=每张卡片上的数字<=50
对于100%的数据,有1<=N<=50 1<=M<=50 1<=每张卡片上的数字<=50

解题思路

看到这个题,我刚开始果断爆搜。。。然后果断得了0分。后来萌萌哒的老师给我们讲了这个题。。。原来是一个DP

f[i,j]表示还有i个人时,第j个人的获胜概率,然后枚举下一局出局的人的标号,来判断j下一局的编号(传说中的重标号),将方程转移过去f[i,j]:=Σf[i-1,k]/m+f[i,j](k为重标号后的序号)

 1 program t2;
 2 var
 3 f:array[1..50,1..50] of real;
 4 a:Array[1..50] of longint;
 5 n,m,i,w,k,j:Longint;
 6 begin
 7     read(n,m);
 8     for i:=1 to m do read(a[i]);
 9     f[1,1]:=1;//当只有一个人标号为1的获胜概率为1
10     for i:=2 to n do
11         for j:=1 to n do
12             for k:=1 to m do
13             begin
14                 w:= a[k] mod i;
15                 if w=0 then w:=i;//特判
16                 if w>j then f[i,j]:=f[i-1,(I-w+j)]/m+f[i,j];//重标号的过程
17                 if w<j then f[i,j]:=f[i-1,j-w]/m+F[I,J];
18 
19             end;
20      for i:=1 to n do write(f[n,i]*100:0:2,'%',' ');
21 end.

 

转载于:https://www.cnblogs.com/wuminyan/p/4737898.html

相关文章:

  • Andriod下载源码导入后AndroidManifest.xml小红叉的解决办法
  • IE浏览器下ajax缓存导致数据不更新的解决方法
  • coredata
  • 一个java实现的简单的4则运算器
  • Opengl中矩阵和perspective/ortho的相互转换
  • 学习日志---pyhon入门必备
  • 数组作函数参数传递和函数返回值
  • 关于重连测试的一点研究
  • 关于c++字符串的while(*temp++)
  • Java版本的删除指定目录及子目录下名叫“xxx.txt”的所有文件
  • PostgreSQL通过pg_upgrade进行大版本升级
  • MyBatis——动态SQL
  • 南阳483--Nightmare(Bfs)
  • 系统启动流程
  • 8-30 文件查找命令find使用说明和练习
  • 2018一半小结一波
  • android高仿小视频、应用锁、3种存储库、QQ小红点动画、仿支付宝图表等源码...
  • Apache的基本使用
  • C++回声服务器_9-epoll边缘触发模式版本服务器
  • Docker入门(二) - Dockerfile
  • DOM的那些事
  • Java 内存分配及垃圾回收机制初探
  • Java反射-动态类加载和重新加载
  • Linux学习笔记6-使用fdisk进行磁盘管理
  • spring-boot List转Page
  • Vue2 SSR 的优化之旅
  • 初探 Vue 生命周期和钩子函数
  • 关于使用markdown的方法(引自CSDN教程)
  • 规范化安全开发 KOA 手脚架
  • 前端面试之闭包
  • 如何正确配置 Ubuntu 14.04 服务器?
  • 设计模式(12)迭代器模式(讲解+应用)
  • 适配mpvue平台的的微信小程序日历组件mpvue-calendar
  • 微信公众号开发小记——5.python微信红包
  • 问题之ssh中Host key verification failed的解决
  • 用jquery写贪吃蛇
  • 原创:新手布局福音!微信小程序使用flex的一些基础样式属性(一)
  • ionic入门之数据绑定显示-1
  • Play Store发现SimBad恶意软件,1.5亿Android用户成受害者 ...
  • 交换综合实验一
  • 支付宝花15年解决的这个问题,顶得上做出十个支付宝 ...
  • ​LeetCode解法汇总2583. 二叉树中的第 K 大层和
  • #100天计划# 2013年9月29日
  • #HarmonyOS:软件安装window和mac预览Hello World
  • ${factoryList }后面有空格不影响
  • (11)MATLAB PCA+SVM 人脸识别
  • (笔试题)合法字符串
  • (附源码)python房屋租赁管理系统 毕业设计 745613
  • (附源码)计算机毕业设计SSM疫情居家隔离服务系统
  • (每日持续更新)jdk api之FileReader基础、应用、实战
  • (三)Pytorch快速搭建卷积神经网络模型实现手写数字识别(代码+详细注解)
  • (转)C#开发微信门户及应用(1)--开始使用微信接口
  • (转)Java socket中关闭IO流后,发生什么事?(以关闭输出流为例) .
  • *1 计算机基础和操作系统基础及几大协议
  • .babyk勒索病毒解析:恶意更新如何威胁您的数据安全