【XY1371】细菌分裂

Description

某科学家在培养皿(可以认为培养皿无限大)的正中间0时刻放置了一个分裂能力极强的细菌,它每隔一段时间就会进行分裂。具体地说,当初始的细菌被激活后,它会向前移动T1格(含起点),之后会分裂成两个,方向分别为原方向向左和向右偏移45°,两个细菌分别沿自己的方向移动T2格后再次分裂,……,n个周期后,细菌停止了分裂。现在Smart想知道有多少个格子被细菌污染了(注意,只要细菌经过的格子就会被污染,一个格子多次经过算一次,一个格子可以同时存在多个细菌,具体见样例及样例说明)。

Input

第一行一个正整数n,代表周期数。
接下来n个非负整数Ti,代表各个周期的长度。

Output

输出一行,包含一个整数表示被污染的格子数。

Sample Input

3
2
3
3

Sample Output

20

Sample Explanation

Hint

5%的数据:n=1;
25%的数据:n≤2;
55%的数据:n≤20;
另有25%的数据:n≤27,T1=T2=…..=Tn;
100%的数据:n≤50,T1+T2+…+Tn ≤200。

----------------------------------------------------------------------------------

算法:记忆化搜索

题解

这题用记忆化搜索,状态f(t,x,y,d),其中t表示时间,(x,y)表示细菌所处位置,d表示方向。

如果(x,y)被第一次访问,那么答案+1

每当到了一个周期,就转向就可以了~

细节处理可能有点繁琐,慢慢做就好啦

代码

#include<cstdio>
#include<iostream>
using namespace std;
const int N=55,M=206;
int dx[8]={-1,-1,0,1,1,1,0,-1};
int dy[8]={0,-1,-1,-1,0,1,1,1};
int ans=0,tot=0;
bool f[206],vis[406][406],used[206][406][406][8];
void dfs(int t, int x, int y, int d)
{
    if(t>tot) return;
    if(used[t][x][y][d]) return; //记忆化
    used[t][x][y][d]=true;
    if(!vis[x][y])
    {
        ans++;
        vis[x][y]=true;
    }
    if(f[t]) //转向45度
    {
        dfs(t+1,x+dx[(d+1)%8],y+dy[(d+1)%8],(d+1)%8);
        dfs(t+1,x+dx[(d+7)%8],y+dy[(d+7)%8],(d+7)%8);
    }
    else dfs(t+1,x+dx[d],y+dy[d],d);
}
int main()
{
    int n,t;
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&t);
        tot+=t;
        f[tot]=true;
    }
    dfs(1,tot,tot,0);
    printf("%d",ans);
}
时间: 2024-10-07 09:02:02

【XY1371】细菌分裂的相关文章

BNUOJ34976数细菌

数细菌 Time Limit: 1000ms Memory Limit: 65536KB Special Judge 64-bit integer IO format: %lld      Java class name: Main Prev Submit Status Statistics Discuss Next Font Size:  +   - Type:   None Graph Theory      2-SAT     Articulation/Bridge/Biconnected

肚子里恶心事_细菌攻击人体流程图

目录: 1.细菌攻击人体流程图 2.建议人类 3.杀菌方法 4.疫苗防御法 1.细菌攻击人体流程图 1.1藏身之处 土壤,脏水,粪便,垃圾桶 1.2.行动方案: 第一个目标:爬上人类的手掌,手指和衣服,然后钻进他们的食物.人类手指甲是绝妙的避难所.苍蝇能提供空中支援.当苍蝇落下来停留在潮湿的地方,你就瞄准它,让它把你从牛粪中带走,然后集结在人类食物上. 细菌还能靠灰尘传播. 1.3.污染食物: 细菌吞食食物,先喷出酶把食物变成烂泥,再把它吸入体内,制造大量的化学废物使食物腐烂变臭. 1.4.细菌

细菌简介2

目录 0.细菌特征 1.细菌类别 2.益生菌报道 3.细菌相关 0.细菌特征 细菌有的是链条形状,有的是细小斑点,有的呈圆形或螺旋形,甚至一种像章鱼. 细菌无所不在,38亿年前,在苏格兰就发现古生菌archaea的生物指纹,在美国黄石公园的火山喷发口也能发现古生菌,高温.可以生存在强酸强碱或盐浓度很高的环境中.这么顽强细菌生物让我想起了电影中异形 大小0.5-1.5微米之间,一个手指甲可以藏一万多个细菌. 有害菌可制造致命的化合物,可使人神经停止工作.导致人不能动弹.毒素通过使人停止呼吸或中断人

biofilm细菌矩阵

biofilm就是一个细菌矩阵,功能强大得如同航空母舰.一个生物膜可以有成百上千种细菌组成,生物膜对抗生素抗体是单个细菌的400倍,生物膜细菌群可以不用分裂而继续生存,并进行不同次级代谢:生物膜还具有群体感应,外界ph,抗生素等外部因素对其基本不起作用.下图是生物膜形成5个阶段.多么恐怖... Oral microbiology is the study of the microorganisms of the oral cavity(腔) and theinteractions(相互作用) b

【bzoj2064】分裂【压状dp】

Description 背景: 和久必分,分久必和... 题目描述: 中国历史上上分分和和次数非常多..通读中国历史的WJMZBMR表示毫无压力. 同时经常搞OI的他把这个变成了一个数学模型. 假设中国的国土总和是不变的. 每个国家都可以用他的国土面积代替, 又两种可能,一种是两个国家合并为1个,那么新国家的面积为两者之和. 一种是一个国家分裂为2个,那么2个新国家的面积之和为原国家的面积. WJMZBMR现在知道了很遥远的过去中国的状态,又知道了中国现在的状态,想知道至少要几次操作(分裂和合并

Bzoj1188 [HNOI2007]分裂游戏

Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1110  Solved: 679 Description 聪聪和睿睿最近迷上了一款叫做分裂的游戏. 该游戏的规则试: 共有 n 个瓶子, 标号为 0,1,2.....n-1, 第 i 个瓶子中装有 p[i]颗巧克力豆,两个人轮流取豆子,每一轮每人选择 3 个瓶子.标号为 i,j,k, 并要保证 i < j , j < = k 且第 i 个瓶子中至少要有 1 颗巧克力豆,随后这个人从第 i 个瓶子中

分裂游戏(bzoj 1188)

Description 聪聪和睿睿最近迷上了一款叫做分裂的游戏. 该游戏的规则试: 共有 n 个瓶子, 标号为 0,1,2.....n-1, 第 i 个瓶子中装有 p[i]颗巧克力豆,两个人轮流取豆子,每一轮每人选择 3 个瓶子.标号为 i,j,k, 并要保证 i < j , j < = k 且第 i 个瓶子中至少要有 1 颗巧克力豆,随后这个人从第 i 个瓶子中拿走一颗豆 子并在 j,k 中各放入一粒豆子(j 可能等于 k) .如果轮到某人而他无法按规则取豆子,那么他将输 掉比赛.胜利者可以

innodb 锁分裂继承与迁移

innodb行锁简介 行锁类型 LOCK_S:共享锁 LOCK_X: 排他锁 GAP类型 LOCK_GAP:只锁间隙 LOCK_REC_NO_GAP:只锁记录 LOCK_ORDINARY: 锁记录和记录之前的间隙 LOCK_INSERT_INTENTION: 插入意向锁,用于insert时检查锁冲突 每个行锁由锁类型和GAP类型组成例如:LOCK_X|LOCK_ORDINARY 表示对记录和记录之前的间隙加排他锁LOCK_S|LOCK_GAP 表示只对记录前的间隙加共享锁 锁的兼容性:值得注意的

POJ C程序设计进阶 编程题#5:细菌分组实验

编程题#5:细菌实验分组 来源: POJ (Coursera声明:在POJ上完成的习题将不会计入Coursera的最后成绩.) 注意: 总时间限制: 1000ms 内存限制: 65536kB 描述 有一种细菌分为A.B两个亚种,它们的外在特征几乎完全相同,仅仅在繁殖能力上有显著差别,A亚种繁殖能力非常强,B亚种的繁殖能力很弱.在一次为时一个 小时的细菌繁殖实验中,实验员由于疏忽把细菌培养皿搞乱了,请你编写一个程序,根据实验结果,把两个亚种的培养皿重新分成两组. 输入 输入有多行,第一行为整数n(