题目链接

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. Vue 3 组件基础与模板语法详解

    title: Vue 3 组件基础与模板语法详解 date: 2024/5/24 16:31:13 updated: 2024/5/24 16:31:13 categories: 前端开发 tags: ...

  2. CSS操作——文本属性

    1.font-style(字体样式风格) /* 属性值: normal:设置字体样式为正体.默认值. italic:设置字体样式为斜体.这是选择字体库中的斜体字. oblique:设置字体样式为斜体. ...

  3. 《最新出炉》系列入门篇-Python+Playwright自动化测试-48-Route类拦截修改请求-上篇

    1.简介 在日常工作和学习中,自动化测试的时候:在加载页面时,可能页面出现很多不是很重要或者不是我们所关注的,这个时候我们就可以选择不加载这些内容,以提高页面加载速度,节省资源.例如:可能页面上图片比 ...

  4. 莫烦tensorflow学习记录 (1)session会话控制、variable变量、placeholder传入值

    https://mofanpy.com/tutorials/machine-learning/tensorflow/session/ Session 会话控制 #https://mofanpy.com ...

  5. ncnn的blob_vkallocator、workspace_vkallocator、staging_vkallocator区别

    ncnn::Extractor中有三个成员函数: void set_blob_vkallocator(VkAllocator* allocator); void set_workspace_vkall ...

  6. LINQ to Entities does not recognize the method 'System.String ToString()' method

    LINQ to Entities does not recognize the method 'System.String ToString()' method, and this method ca ...

  7. ssh基础

    SSH安全登录 机器准备 什么是SSH SSH 或 Secure Shell 协议是一种远程管理协议,允许用户通过 Internet 访问.控制和修改其远程服务器. SSH 服务是作为未加密 Teln ...

  8. mysql删除主键索引,删除索引语法

    mysql删除主键索引,删除索引语法 ### Incorrect table definition; there can be only one auto column and it must be ...

  9. Postman 的 Basic Auth 如何通过 Feign 实现

    Postman 的 Basic Auth: 分析 根据以上图片分析: Postman 的 Authorization 实际为: header 中添加 Authorization: ******* ** ...

  10. Latex 公式 如何转为Word 公式,免费线上网站

    在实际中,我们常常需要讲将atex公式在word中书写.不采用手敲word公式,如何直接从Latex公式转word公式: 非常好的网站:https://www.latexlive.com/ 可以直接复 ...