BZOJ1088(SCOI2005)

枚举第一行第一个格子的状态(有雷或者无雷,0或1),然后根据第一个格子推出后面所有格子的状态。推出之后判断解是否可行即可。

 1 #include <bits/stdc++.h>
 2
 3 using namespace std;
 4
 5 #define REP(i,n)                for(int i(0); i <  (n); ++i)
 6 #define rep(i,a,b)              for(int i(a); i <= (b); ++i)
 7 #define dec(i,a,b)              for(int i(a); i >= (b); --i)
 8 #define for_edge(i,x)           for(int i = H[x]; i; i = X[i])
 9
10 #define LL      long long
11 #define ULL     unsigned long long
12 #define MP      make_pair
13 #define PB      push_back
14 #define FI      first
15 #define SE      second
16 #define INF     1 << 30
17
18 const int N     =    100000      +       10;
19 const int M     =    10000       +       10;
20 const int Q     =    1000        +       10;
21 const int A     =    30          +       1;
22
23 int a[N], b[N];
24 int n;
25 int ans;
26
27 int main(){
28 #ifndef ONLINE_JUDGE
29     freopen("test.txt", "r", stdin);
30     freopen("test.out", "w", stdout);
31 #endif
32
33     scanf("%d", &n);
34     rep(i, 1, n) scanf("%d", a + i);
35     rep(i, 0, 1){
36         bool flag = true;
37         b[1] = i;
38         rep(j, 2, n) b[j] = a[j - 1] - b[j - 1] - b[j - 2];
39         rep(j, 2, n - 1) if (b[j] < 0 || b[j] > 1){ flag = false; break;}
40         if (b[n] < 0 || b[n] > 1) flag = false;
41         rep(j, 1, n) if (b[j - 1] + b[j] + b[j + 1] != a[j]){ flag = false; break;}
42         //rep(j, 1, n) printf("%d ", b[j]); putchar(10);
43
44         if (flag) ++ans;
45     }
46
47     printf("%d\n", ans);
48
49
50
51     return 0;
52
53 }
时间: 2024-11-03 21:10:19

BZOJ1088(SCOI2005)的相关文章

bzoj1088[SCOI2005]扫雷

bzoj1088[SCOI2005]扫雷 题意: 有一个n×2的棋盘,第一列里面某些格子是雷,而第二列没有雷.由于第一列的雷可能有多种方案满足第二列的信息的限制,求根据第二列的信息第一列雷有多少种摆放方案. 题解: 水题,因为每个第一行的格子可以根据前一个第二行的格子里的信息唯一确定是否有雷,所以只要枚举第一个格子有没有雷就行. 代码: 1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 #

bzoj1088: [SCOI2005]扫雷Mine(DP)

1088: [SCOI2005]扫雷Mine 题目:传送门 题解: 一道DP(玩过扫雷的资深玩家肯定一眼秒%%%) 其实定义一个F数组表示1~i的数目就OK. 前两个格子完全可以与处理出来,后面的for一次就搞定了 水了一题... 代码: 1 #include<cstdio> 2 #include<cstring> 3 #include<cstdlib> 4 #include<cmath> 5 #include<algorithm> 6 #def

【题解】 bzoj1088: [SCOI2005]扫雷Mine (神奇的做法)

bzoj1088,懒得复制,戳我戳我 Solution: 其实这个有个结论,答案只会有\(0\),\(1\),\(2\)三种(我真的是个弱鸡,这个都想不到) 然后我们假设第一个就可以推出所有的状态(显然) 没了,and 我真的菜 Code: //It is coded by Ning_Mew on 5.6 #include<bits/stdc++.h> using namespace std; const int maxn=1e4+7; int n,a[maxn]; int ans=0; in

BZOJ1088 [SCOI2005]扫雷Mine

Description 相信大家都玩过扫雷的游戏.那是在一个n*m的矩阵里面有一些雷,要你根据一些信息找出雷来.万圣节到了 ,“余”人国流行起了一种简单的扫雷游戏,这个游戏规则和扫雷一样,如果某个格子没有雷,那么它里面的数字 表示和它8连通的格子里面雷的数目.现在棋盘是n×2的,第一列里面某些格子是雷,而第二列没有雷,如下图: 由于第一列的雷可能有多种方案满足第二列的数的限制,你的任务即根据第二列的信息确定第一列雷有多少种摆放 方案. Input 第一行为N,第二行有N个数,依次为第二列的格子中

【暴力】【推导】bzoj1088 [SCOI2005]扫雷Mine

考虑右侧的一个格子是否放雷,只可能对其左侧的三个格子造成影响. 也就是说,若左侧一个格子旁的两个格子已经放了雷,对第三个格子也就唯一确定了. 因此只枚举前两个格子是否放雷,剩下的暴力判断是否合法即可. 但是再想想,左侧第一个格子只受右侧前两个格子的影响.所以只枚举右侧第一个格子是否放雷,剩下的判断是否合法即可. 1 #include<cstdio> 2 #include<cstring> 3 using namespace std; 4 int n,a[10001],t[10001

bzoj1088:[SCOI2005]扫雷Mine

题目描述 相信大家都玩过扫雷的游戏.那是在一个n*m的矩阵里面有一些雷,要你根据一些信息找出雷来.万圣节到了,"余"人国流行起了一种简单的扫雷游戏,这个游戏规则和扫雷一样,如果某个格子没有雷,那么它里面的数字表示和它8连通的格子里面雷的数目.现在棋盘是n×2的,第一列里面某些格子是雷,而第二列没有雷,如下图: 由于第一列的雷可能有多种方案满足第二列的数的限制,你的任务即根据第二列的信息确定第一列雷有多少种摆放方案. 输入 第一行为N,第二行有N个数,依次为第二列的格子中的数.(1<

BZOJ 1088: [SCOI2005]扫雷Mine 枚举

枚举前两位,递推剩下的 1088: [SCOI2005]扫雷Mine Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 1832  Solved: 1090 [Submit][Status][Discuss] Description 相信大家都玩过扫雷的游戏.那是在一个n*m的矩阵里面有一些雷,要你根据一些信息找出雷来.万圣节到了,"余"人国流行起了一种简单的扫雷游戏,这个游戏规则和扫雷一样,如果某个格子没有雷,那么它里面的数字表示和它8

[SCOI2005]互不侵犯King

1087: [SCOI2005]互不侵犯King Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 4255  Solved: 2458 [Submit][Status][Discuss] Description 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上 左下右上右下八个方向上附近的各一个格子,共8个格子. Input 只有一行,包含两个数N,K ( 1 <=N <=9, 0 <=

BZOJ1082: [SCOI2005]栅栏

1082: [SCOI2005]栅栏 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1906  Solved: 816[Submit][Status][Discuss] Description 农夫约翰打算建立一个栅栏将他的牧场给围起来,因此他需要一些特定规格的木材.于是农夫约翰到木材店购买木材.可是木材店老板说他这里只剩下少部分大规格的木板了.不过约翰可以购买这些木板,然后切割成他所需要的规格.而且约翰有一把神奇的锯子,用它来锯木板,不会产生任