CSUOJ 1063 Sequence

本文解析了CSUOJ1063Sequence题目,介绍了一种通过转换运算表达式来简化问题的方法,从而快速找出解的可能性范围。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

CSUOJ 1063 Sequence

题目虽然看起来比较繁琐,但是意思还是比较明确的。有一组数据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") ;
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值