2022 ICPC 沈阳 L(模拟 , dfs)

news/2024/11/20 9:48:35/

2022 ICPC 沈阳 L(模拟 , dfs)

Problem - L - Codeforces

大意:给出两支队伍 , 交替发动攻击 , 问两支队伍分别获胜和平局的概率。

一:先手规则:

两队轮流发动攻击(take turns) ,人数多的先手 , 人数相同先手概率都是 50%。

Alice and Bob’s teams take turns to attack, and the team that has more minions takes the first attack. In case of a tie(平局), it will be decided by a coin toss — 50% probability for Alice taking the first attack and the remaining 50% probability for Bob taking the first attack.

二:攻击规则

When a team takes the attack, the leftmost minion(仆从) taking the minimum number of attacks from the team attacks one of the alive minions from the other team uniformly at random, and then the other team takes the attack.

队伍中最靠左且攻击次数最少的仆从发动攻击 , 等概率的攻击另一个队伍中活着的成员。

思路:由于 n 和 m 范围都很小 , 深搜模拟即可。要注意的是

1. 决定谁先攻击的是攻击次数 ,而不是其他东西。

2. 对于概率的计算 , 到达每个局面的概率都是不同的 , 所以不能用次数去代替概率。

3. 对于深搜的写法来说 , 一定要注意各个数组的回溯 , 尤其是攻击次数数组的回溯 , 这很重要。

#include<bits/stdc++.h>
using namespace std;
#define fi first
#define se second
#define IOS std::ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
#define int long long
const int N = 10;
const int mod = 1e9 + 7;
typedef pair<int,int>PII;int n , m;
int a[N] , b[N];//攻击力
int aa[N] , bb[N];//血量
int cnta[N] , cntb[N];//攻击次数
bool visa[N] , visb[N];//存活情况
int al , bl;
double sum1 , sum2 , sum3;// 奇数 a 走 偶数 b 走
void dfs(int x , double now){if(al == 0 && bl){ sum2 += now; return ; }if(al && bl == 0){ sum1 += now; return ; }if(al == 0 && bl == 0){ sum3 += now; return ; }int id = 0 , cnt = 9e18;if(x % 2 == 0){for(int i = 1 ; i <= m ; i ++){if(visb[i]) continue;if(cntb[i] < cnt){cnt = cntb[i];id = i;}}cntb[id] += 1;double alive = al;for(int i = 1 ; i <= n ; i ++){if(visa[i) continue;bb[id] -= a[i];aa[i]  -= b[id];if(bb[id] <= 0) visb[id] = 1 , bl -= 1;if(aa[i]  <= 0) visa[i]  = 1 , al -= 1;dfs(x + 1 , now / alive);bb[id] += a[i];aa[i]  += b[id];if(visb[id]) visb[id] = 0 , bl += 1;if(visa[i]) visa[i] = 0 , al += 1;}cntb[id] -= 1;//回溯攻击次数数组} else {for(int i = 1 ; i <= n ; i ++){if(visa[i]) continue;if(cnta[i] < cnt){cnt = cnta[i];id = i;}}cnta[id] += 1;double alive = bl;for(int i = 1 ; i <= m ; i ++){if(visb[i]) continue;aa[id] -= b[i];bb[i]  -= a[id];if(aa[id] <= 0) visa[id] = 1 , al -= 1;if(bb[i]  <= 0) visb[i]  = 1 , bl -= 1;dfs(x + 1 , now / alive);aa[id] += b[i];bb[i]  += a[id];if(visa[id]) visa[id] = 0 , al += 1;if(visb[i]) visb[i] = 0 , bl += 1;}cnta[id] -= 1;}
}signed main(){IOScout << fixed << setprecision(10);cin >> n >> m;for(int i = 1 ; i <= n ; i ++) cin >> a[i] , aa[i] = a[i];for(int i = 1 ; i <= m ; i ++) cin >> b[i] , bb[i] = b[i];al = n;bl = m;if(n == m){ dfs(1 , 0.5); dfs(0 , 0.5) ;}if(n > m) dfs(1 , 1.0);if(n < m) dfs(0 , 1.0);cout << sum1 << " " << sum2 << " " << sum3 << "\n";return 0;
}

http://www.ppmy.cn/news/1039141.html

相关文章

linux 的swap、swappiness及kswapd原理【转+自己理解】

本文讨论的 swap基于Linux4.4内核代码 。Linux内存管理是一套非常复杂的系统&#xff0c;而swap只是其中一个很小的处理逻辑。 希望本文能让读者了解Linux对swap的使用大概是什么样子。阅读完本文&#xff0c;应该可以帮你解决以下问题&#xff1a; swap到底是干嘛的&#xf…

【C++】set/multiset容器

1.set基本概念 #include <iostream> using namespace std;//set容器构造和赋值 #include<set>//遍历 void printSet(const set<int>& st) {for (set<int>::const_iterator it st.begin(); it ! st.end(); it){cout << *it << " …

也许你正处于《孤注一掷》中的“团队”,要留心了

看完这部电影&#xff0c;心情久久不能平静&#xff0c;想了很多&#xff0c;倒不是担心自己哪天也成为“消失的yaozi”&#xff0c;而是在想&#xff0c;我们每天所赖以生存的工作&#xff0c;跟电影里他们的工作比&#xff0c;差别在哪里呢&#xff1f; 目录 1. 产品的本质…

We Were Both Children(cf)

题意&#xff1a;米哈伊和斯拉夫人正在观察一组数量为n的青蛙&#xff0c;它们最初都位于0点。青蛙的跳跃长度为一米。每一秒&#xff0c;青蛙都会向前跳。在任何青蛙开始跳跃之前&#xff0c;Slavic和Mihai都可以在一个坐标中准确地放置一个rap(陷阱&#xff09;&#xff0c;以…

go-zero 是如何实现令牌桶限流的?

原文链接&#xff1a; 上一篇文章介绍了 如何实现计数器限流&#xff1f;主要有两种实现方式&#xff0c;分别是固定窗口和滑动窗口&#xff0c;并且分析了 go-zero 采用固定窗口方式实现的源码。 但是采用固定窗口实现的限流器会有两个问题&#xff1a; 会出现请求量超出限…

如何用Apipost实现sign签名?

我们平常对外的接口都会用到sign签名&#xff0c;对不同的用户提供不同的apikey ,这样可以提高接口请求的安全性&#xff0c;避免被人抓包后乱请求。 如何用Apipost实现sign签名&#xff1f; 可以在Apipost中通过预执行脚本调用内置的JS库去实现预执行脚本是在发送请求之前自…

【Leetcode】84.柱状图中最大的矩形(Hard)

一、题目 1、题目描述 给定 n n n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。 求在该柱状图中,能够勾勒出来的矩形的最大面积。 示例1: 输入:heights = [2,1,5,6,2,3] 输出:10 解释:最大的矩形为图中红色区域,面积为 10示例2:…

JVM——JDK 监控和故障处理工具总结

文章目录 JDK 命令行工具jps:查看所有 Java 进程jstat: 监视虚拟机各种运行状态信息 jinfo: 实时地查看和调整虚拟机各项参数jmap:生成堆转储快照**jhat**: 分析 heapdump 文件**jstack** :生成虚拟机当前时刻的线程快照 JDK 可视化分析工具JConsole:Java 监视与管理控制台连接…