博客
关于我
恐怖的奴隶主
阅读量:330 次
发布时间:2019-03-04

本文共 3274 字,大约阅读时间需要 10 分钟。

恐怖的奴隶主

题目

L L L热衷于 u n d e r c a r d s undercards undercards

u n d e r c a r d s undercards undercards中,有四个格子。每个格子要么是空的,要么住着一只 B i g B o b BigBob BigBob

每个 B i g B o b BigBob BigBob有一个不超过 k k k的血量;血量减到 0 0 0视为死亡。那个格子随即空出。

当一只 B i g B o b BigBob BigBob受到伤害后,假如它没有死亡且剩余血量为 t t t,它会从左数第一个空格处召唤一只血量为 a [ t ] a[t] a[t] B i g B o b BigBob BigBob;若没有空格,则不会召唤。

法术 R R R定义为:从左往右,对每个 B i g B o b BigBob BigBob造成一点伤害;假如有 B i g B o b BigBob BigBob死亡,重复上述效果。

聪明的小 L L L发现,在某些情况下,当他发动法术 R R R时,游戏会陷入循环。

他想求出这样的初始情形有多少种。

输入

输入一个正整数 k k k

随后一行 k − 1 k-1 k1个正整数,表示 a [ 1 ] ~ a [ k − 1 ] a[1]~a[k-1] a[1]a[k1]

输出

输出一个整数,表示答案。

样例输入

22

样例输出

31

样例解释

B i g b o b Bigbob Bigbob最多有 2 2 2血,满血 b i g b o b bigbob bigbob受伤会召出新的。

循环的初始状态有:
( 2 , 1 , 0 , 0 ) , ( 1 , 2 , 0 , 0 ) , ( 2 , 0 , 1 , 0 ) , ( 2 , 1 , 1 , 0 ) , ( 0 , 2 , 1 , 0 ) , ( 1 , 2 , 1 , 0 ) , ( 2 , 2 , 1 , 0 ) , ( 1 , 0 , 2 , 0 ) , ( 0 , 1 , 2 , 0 ) , (2,1,0,0),(1,2,0,0),(2,0,1,0),(2,1,1,0),(0,2,1,0),(1,2,1,0),(2,2,1,0) ,(1,0,2,0),(0,1,2,0), (2,1,0,0),(1,2,0,0),(2,0,1,0),(2,1,1,0),(0,2,1,0),(1,2,1,0),(2,2,1,0),(1,0,2,0),(0,1,2,0),
( 1 , 1 , 2 , 0 ) , ( 2 , 1 , 2 , 0 ) , ( 2 , 1 , 0 , 1 ) , ( 0 , 2 , 0 , 1 ) , ( 1 , 2 , 0 , 1 ) , ( 0 , 2 , 1 , 1 ) , ( 1 , 2 , 1 , 1 ) , ( 0 , 0 , 2 , 1 ) , (1,1,2,0),(2,1,2,0),(2,1,0,1),(0,2,0,1),(1,2,0,1),(0,2,1,1),(1,2,1,1),(0,0,2,1), (1,1,2,0),(2,1,2,0),(2,1,0,1),(0,2,0,1),(1,2,0,1),(0,2,1,1),(1,2,1,1),(0,0,2,1),
( 1 , 0 , 2 , 1 ) , ( 0 , 1 , 2 , 1 ) , ( 1 , 1 , 2 , 1 ) , ( 2 , 1 , 2 , 1 ) , ( 0 , 2 , 2 , 1 ) , ( 1 , 2 , 2 , 1 ) , ( 2 , 1 , 0 , 2 ) , ( 1 , 2 , 0 , 2 ) , (1,0,2,1),(0,1,2,1),(1,1,2,1),(2,1,2,1),(0,2,2,1),(1,2,2,1),(2,1,0,2) ,(1,2,0,2), (1,0,2,1),(0,1,2,1),(1,1,2,1),(2,1,2,1),(0,2,2,1),(1,2,2,1),(2,1,0,2),(1,2,0,2),
( 2 , 0 , 1 , 2 ) , ( 2 , 1 , 1 , 2 ) , ( 0 , 2 , 1 , 2 ) , ( 1 , 2 , 1 , 2 ) , ( 2 , 2 , 1 , 2 ) , ( 2 , 1 , 2 , 2 ) (2,0,1,2),(2,1,1,2),(0,2,1,2),(1,2,1,2),(2,2,1,2),(2,1,2,2) (2,0,1,2),(2,1,1,2),(0,2,1,2),(1,2,1,2),(2,2,1,2),(2,1,2,2)
31 31 31种。

数据范围

对于 30 % 30% 30的数据, k ≤ 5 k≤5 k5

对于 70 % 70% 70的数据, k ≤ 10 k≤10 k10, a [ i ] = k a[i]=k a[i]=k
对于 100 % 100% 100的数据, k ≤ 15 k≤15 k15, 1 ≤ a [ i ] ≤ k 1≤a[i]≤k 1a[i]k

思路

这道题是一道大模拟题。

我们就按着题目模拟一遍就可以了,判断是否会循环的时候可以用 d f s dfs dfs

代码

#include
#include
using namespace std;int K,A[15],next[70001],ans,can[70001];bool in[70001],yes[70001];int place(int a, int b, int c, int d)//给每一种情况找一个地址{ return a*(K+1)*(K+1)*(K+1)+b*(K+1)*(K+1)+c*(K+1)+d;}int ch(int a,int b,int c,int d)//模拟{ bool yes=0; if (a) { a--; if (a) { if (!b) b=A[a]; else if (!c) c=A[a]; else if (!d) d=A[a]; } else yes=1; } if (b) { b--; if (b) { if (!a) a=A[b]; else if (!c) c=A[b]; else if (!d) d=A[b]; } else yes=1; } if (c) { c--; if (c) { if (!a) a=A[c]; else if (!b) b=A[c]; else if (!d) d=A[c]; } else yes=1; } if (d) { d--; if (d) { if (!a) a=A[d]; else if (!b) b=A[d]; else if (!c) c=A[d]; } else yes=1; } if (!yes) return -1; return place(a,b,c,d);}void dfs(int x)//判断是否陷入循环{ if (in[x]) return ; in[x]=1; if (next[x]==-1) { can[x]=1; return ; } dfs(next[x]); if (can[next[x]]==1) can[x]=1; else can[x]=2;}int main(){ memset(next,-1,sizeof(next));//初始化 scanf("%d",&K);//读入 for (int i=1;i

转载地址:http://pcth.baihongyu.com/

你可能感兴趣的文章
Nginx在开发中常用的基础命令
查看>>
Nginx多域名,多证书,多服务配置,实用版
查看>>
nginx如何实现图片防盗链
查看>>
Nginx学习总结(12)——Nginx各项配置总结
查看>>
Nginx学习总结(13)——Nginx 重要知识点回顾
查看>>
Nginx学习总结(14)——Nginx配置参数详细说明与整理
查看>>
Nginx学习总结(15)—— 提升 Web 应用性能的十个步骤
查看>>
Nginx学习总结(8)——Nginx服务器详解
查看>>
nginx学习笔记002---Nginx代理配置_案例1_实现了对前端代码的方向代理_并且配置了后端api接口的访问地址
查看>>
Nginx安装SSL模块 nginx: the “ssl” parameter requires ngx_http_ssl_module in /usr/local/nginx/conf/nginx
查看>>
nginx安装stream模块配置tcp/udp端口转发
查看>>
nginx安装Stream模块配置tcp/udp端口转发
查看>>
Nginx安装与常见命令
查看>>
nginx安装与配置
查看>>
Nginx安装及配置详解
查看>>
nginx安装并配置实现端口转发
查看>>
nginx安装配置
查看>>
Nginx实战之1.1-1.6 Nginx介绍,安装及配置文件详解
查看>>
Nginx实战经验分享:从小白到专家的成长历程!
查看>>
nginx实现二级域名转发
查看>>