题目虽然看起来比较繁琐,但是意思还是比较明确的。有一组数据a[0...n],通过给定的操作运算符,得到对应的b[]数组,然后让你推断出a数组的取值有多少中可能性,其中a中的数字都是正整数。比赛的时候,我是想通过二分搜索来找出这个区间,但是用二分搜索的时候,判定条件有点难写找区间的上下范围。不过这个题目不用这样,这样反倒使问题更复杂了,其实我们可以将除a[0]外的其他元素都表示成对应的只含a[0]的表达式。这样我们就可以很容易找出a[0]的范围,也就求出了解的可能性。在此处对于初始的时候赋值需要注意。特别是当如果给一个大于int范围的数字的时候,我们要在后面加上LL标志为long long 。程序如下:
/*
ID: csuchenan
PROG: Sequence
LANG: C++
*/
#include<stdio.h>
const long long INF = 10000000000000LL ;
const int maxn = 55 ;
int b[maxn] ;
char o[maxn] ;
int n ;
bool init() ;
void work() ;
int main(int argc , char * argv[]){
while(init()){
work() ;
}
return 0 ;
}
bool init(){
if(scanf("%d" , &n) == EOF){
return 0 ;
}
int i ;
for(i = 1 ; i <= n ; i ++){
scanf("%d" , &b[i]) ;
}
scanf("%s" , o) ;
return 1 ;
}
void work(){
long long low ;
long long high ;
char f ;
long long right ;
low = 0 ;
high = INF ;
f = o[0] ;
right = b[1] ;
if(f == '+'){
high = high < right ? high : right ;
}
else{
low = b[1] > 0 ? b[1] : 0 ;
}
int i ;
for(i = 1 ; i < n ; i ++){
if(f == '+' && o[i] == '+'){
f = '-' ;
right = right - b[i+1] ;
low = low > right ? low : right ;
}
else if(f == '+' && o[i] == '-'){
f = '+' ;
right = right - b[i+1] ;
high = high < right ? high : right ;
}
else if(f == '-' && o[i] == '+'){
f = '+' ;
right = right + b[i+1] ;
high = high < right ? high : right ;
}
else{
f = '-' ;
right = right + b[i+1] ;
low = low > right ? low : right ;
}
}
low = low + 1 ;
if(low >= high )
printf("0") ;
else if(high == INF)
printf("-1") ;
else
printf("%d" , high - low ) ;
printf("\n") ;
}