Luogu P2327 [SCOI2005]扫雷【递推/数学】By cellur925

题目传送门

推了好久啊。看来以后要多玩扫雷了qwq.

其实本题只有三种答案:0、1、2.

对于所有第一列,只要第一个数和第二个数确定后,其实整个数列就确定了,我们可以通过这个递推式得出

1     sec[i-1]=fir[i]+fir[i-2]+fir[i-1]

所以我们可以枚举每列的第1/2个数。

如果推到第n+1个数还存在,那么指定这种情况不成立。

Code

 1 #include<cstdio>
 2 #include<algorithm>
 3 #include<cstring>
 4 #define maxn 10090
 5 
 6 using namespace std;
 7 
 8 int n,ans;
 9 int fir[maxn],sec[maxn];
10 
11 bool check()
12 {
13     for(int i=3;i<=n+1;i++)
14         fir[i]=sec[i-1]-fir[i-2]-fir[i-1];
15     if(fir[n+1]) return false;
16     return true;
17 }
18 
19 int main()
20 {
21     scanf("%d",&n);
22     for(int i=1;i<=n;i++) scanf("%d",&sec[i]);
23     for(int k=0;k<=sec[1];k++)
24     {
25         memset(fir,0,sizeof(fir));
26         fir[1]=k;
27         fir[2]=sec[1]-k;
28         if(check()) ans++;
29     }
30     printf("%d",ans);
31     return 0;
32 }
View Code

 

posted @ 2018-08-25 17:05  cellur925&Chemist  阅读(135)  评论(0编辑  收藏  举报