题目链接

Luogu

Codeforces

题意简述

有 \(n\) 个人站成一排,每人手中有 \(k\) 发子弹,每次每人会向除自己外编号最小的人开枪,第 \(i\) 个人开枪的命中率为 \(p_i \%\),剩余最多一人时结束,问有多少种可能的局面。

解法说明

从题目要求中可以发现,每次一定是编号最小的人向编号第二小的人开枪,其余人向编号最小的人开枪,也就是说,每次只有编号最小和第二小的两个人受到枪击。

故对于每一轮,我们可以设此时编号最小的和第二小的人分别为 \(x,y\),令 \(f_{x,y}\) 表示转移到 \(x,y\) 所需要的步数(即消耗的子弹数)则会有以下四种情况:

  • 两人都未被击中

未发生变化,忽略。

  • \(x\) 被击中,而 \(y\) 幸存

此时如满足 \(p_x<100\)(否则 \(y\) 必然被击中)且 \(\exists i \in [y,n], p_i>0\)(否则 \(x\) 无法被击中),则转移到 \(f_{y,y+1}\);

  • \(x\) 幸存,而 \(y\) 被击中

此时如满足 \(p_x>0\)(否则 \(y\) 无法被击中)且 \(\forall i \in [y,n], p_i \ne 0\)(否则 \(x\) 必然被击中),则转移到 \(f_{x,y+1}\);

  • \(x\) 与 \(y\) 都被击中

此时如满足 \(p_x>0\)(否则 \(y\) 无法被击中)且 \(\exists i \in [y,n], p_i>0\)(否则 \(x\) 无法被击中),则转移到 \(f_{y+1,y+2}\)。

剩余细节详见下面代码中的注释。

通过代码

#include<bits/stdc++.h>
using namespace std;
#define PII pair<int,int>
#define mp make_pair
const int N=3010; int n,k,p[N],f[N][N],ans;//ans表示可能的局面的数量
bool Genshin[N],Impact[N];//Genshin[i]表示j取[i,n]中任意值时时是否有p[i]>0,Impact[i]表示j取[i,n]中任意值时时是否有p[i]=100
queue<PII> q; inline int read(){
int x=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9'){
if(ch=='-'){
f=-1;
}
ch=getchar();
}
while(ch>='0'&&ch<='9'){
x=(x<<1)+(x<<3)+(ch^48);
ch=getchar();
}
return x*f;
}//快读 inline void write(int x){
if(x<0){
putchar('-');
x=-x;
}
if(x>9){
write(x/10);
}
putchar(x%10+'0');
}//快写 int main(){
n=read(),k=read();
for(int i=1;i<=n;i++){
p[i]=read();
}
for(int i=n;i>=1;i--){
if(Genshin[i+1]||p[i]>0){
Genshin[i]=1;
}//预处理出Genshin[i]
if(Impact[i+1]||p[i]==100){
Impact[i]=1;
}//预处理出Impact[i]
}
q.push(mp(1,2));
while(!q.empty()){
int x=q.front().first,y=q.front().second;
q.pop();
if(y>n||f[x][y]>=k){
continue;
}//跳过无法转移的情况(剩余人数不大于1或子弹耗尽)
if(Genshin[y]&&p[x]!=100){
if(!f[y][y+1]){
f[y][y+1]=f[x][y]+1;
ans++;
q.push(mp(y,y+1));
}
}//x被击中,y幸存
if(!Impact[y]&&p[x]>0){
if(!f[x][y+1]){
f[x][y+1]=f[x][y]+1;
ans++;
q.push(mp(x,y+1));
}
}//x幸存,y被击中
if(Genshin[y]&&p[x]>0){
if(!f[y+1][y+2]){
f[y+1][y+2]=f[x][y]+1;
ans++;
q.push(mp(y+1,y+2));
}
}//x与y都被击中
}
write(ans+1);//答案要加处在状态(1,2)时的情况
return 0;
}

CF369D Valera and Fools 题解的更多相关文章

  1. Codeforces Round #216 (Div. 2) D. Valera and Fools

    题目链接:http://codeforces.com/contest/369/problem/D 注意题意:所有fools都向编号最小的fool开枪:但每个fool都不会笨到想自己开枪,所以编号最小的 ...

  2. cf D. Valera and Fools

    http://codeforces.com/contest/369/problem/D 标号最小的两个人会有四种状态:a活b活,a死b活,a活b死,a死b死:按照这四种状态dfs就可以求出最后的数量. ...

  3. CF_216_Div_2

    比赛链接:http://codeforces.com/contest/369 369C - Valera and Elections: 这是一个树上问题,用深搜,最开始贪心想得是只加叶子节点,找到一个 ...

  4. Codeforces Round #216 (Div. 2)

    以后争取补题不看别人代码,只看思路,今天就是只看思路补完的题,有点小激动. A. Valera and Plates 水题,贪心地先放完第一种食物,在考虑第二种. 居然被卡了一会,心态要蹦 :(: # ...

  5. 坑爹CF April Fools Day Contest题解

    H - A + B Strikes Back A + B is often used as an example of the easiest problem possible to show som ...

  6. April Fools Contest 2017 题解&源码(A,数学 B,数学 C,数学 D,字符串 E,数字逻辑 F,排序,卡时间,G,数学)

    A. Numbers Joke time limit per test:2 seconds memory limit per test:64 megabytes input:standard inpu ...

  7. April Fools Contest 2017 题解

    趁着上课无聊,来补一补-- A. Numbers Joke 直接oeis就好了:http://oeis.org/search?q=numbers+joke&language=english&a ...

  8. 题解 CF191C 【Fools and Roads】

    树上差分半裸题 常规思路是进行三次DFS,然后常规运算即可 这里提供两次dfs的思路(wyz tql orz) 我们以样例2为例 我们考虑任意一条路径,令其起点为u终点为v,每走一次当前路径则v的访问 ...

  9. April Fools Day Contest 2014

    April Fools Day Contest 2014 A.C.H三道题目 ============================================================= ...

  10. Codeforces Round #212 (Div. 2) D. Fools and Foolproof Roads 并查集+优先队列

    D. Fools and Foolproof Roads   You must have heard all about the Foolland on your Geography lessons. ...

随机推荐

  1. 【题解】A18747.眼红的同学

    题目链接:眼红的同学 题干信息很简单,看到数据量之后就不简单了.在数据量小的时候可以使用双层循环暴力的方法来求答案.显然对于这道题而言O(n^2)是完全过不去的. 前置知识: 使用树状数组求逆序对 会 ...

  2. 【ESP32】制作 Wi-fi 音箱(HTTP + I2S 协议)

    用 Wifi 来传输音频数据,会比蓝牙更好.使用蓝牙方式,不管你用什么协议,都会对数据重新编码,说人话就是有损音质,虽然不至于全损.而使用 Wifi 就可以将 PCM 数据直接传输,无需再编码和压缩. ...

  3. 基于 OAuth2.0 协议的单点登录系统方案设计

    一.什么是单点登录? 单点登录(Single Sign On),简称为 SSO,是比较流行的企业业务整合的解决方案之一.SSO 的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用 ...

  4. 抖音App动态调试

    一.准备工作 1)接上一篇,下载砸过壳的抖音IPA 2)MonkeyDev环境 3)class_dump 二.使用MonkeyDev建立空的工程,拖入IPA到目标文件夹中 1)启动Xcode进行编译执 ...

  5. css 透明气泡效果

    css body { background:#333333; } .login-card { text-align:center; width:430px; height:430px; margin: ...

  6. MySql 增、删、改、查数据库

    前言 之前几天写了MySql 的GROUP BY 语句和 JOIN 语句,今天补一下创建数据库.表的语句.首先假设已经暗转好MySQL 数据库,然后创建数据库.表. 创建数据库 create data ...

  7. mysql自带test数据库表的默认属性:Collation latin1_swedish_ci 更新为utf8_general_ci,解决MYSQL数据库乱码

    ## mysql自带test数据库表的默认属性:Collation latin1_swedish_ci 更新为utf8_general_ci,解决MYSQL数据库乱码USE test;CREATE T ...

  8. C# 8字节byte数组转int

    对方是协议 对于整型.长整型等数据类型,Big endian 认为第一个字节是最高位字节(按照从低地址到高地址的顺序存放数据的高位字节到低位字节):而 Little endian 则相反,它认为第一个 ...

  9. 认真学习css3-2-css的选择器

    关于有哪些选择器,具体可以查看w3school. 本文写了一个考卷的例子,带有部分js,jquery.不会针对每个选择器做示例,只练习了一些常用的,有意思的. 先看html/js代码: <!DO ...

  10. k8s集群搭建及对一些组件的简单理解(二)

    背景 前面写了一篇,k8s集群搭建及对一些组件的简单理解(一),主要讲了下背景和对一些组件的理解. 今天讲一下正式的安装,有网环境的,后续再说下无外网环境纯内网的. k8s集群节点.组件 控制面节点, ...