Codeforces Round #266 (Div. 2) D
复制题目占字数
真是NICE的题目。很考验思路
我的参考博客来一枚:http://blog.csdn.net/rowanhaoa/article/details/39343525
我再解释一下:先预处理一下,a[i]=h-a[i];
然后定义 b[i]=a[i]-a[i-1];(1<=i<=n+1);
假如b[i]的值 -1<=b[i]<=1,如果有数不满足答案为0;
为什么,举个例子 n=4
a: 1 2 3 2;
处理后 b: 1 1 1 -1 -2;最后一项为-2,所以答案为0;
其实我们可以发现:最后a[n]一定<=1 因为它只能做一次在末尾,在中间的情况类推。
基本就是前面博主的正文了
1 #include<stdio.h> 2 #include<string.h> 3 #include<iostream> 4 using namespace std; 5 typedef long long ll; 6 #define mod 1000000007 7 #define N 2222 8 int a[N],b[N]; 9 10 11 int main() 12 { 13 int n,h; 14 cin>>n>>h; 15 ll ans=1; 16 ll cnt=0; 17 for (int i=1;i<=n;i++) cin>>a[i],a[i]=h-a[i]; 18 for (int i=1;i<=n+1;i++) b[i]=a[i]-a[i-1]; 19 20 for (int i=1;i<=n+1;i++) 21 { 22 if (b[i]==1) cnt++; 23 else if (b[i]==0) ans=ans*(cnt+1)%mod; 24 else if (b[i]==-1) ans=ans*cnt%mod,cnt--; 25 else 26 { 27 ans=0; 28 break; 29 } 30 } 31 cout<<ans<<endl; 32 return 0; 33 }
随性Code