POJ3061 C语言代码

原题链接
题目不再描述了。

方法: 尺取法(追逐法)
a 为 正数 数组
设子序列
左端点为 i
右端点为 j
sum 为 子序列 的 和。
{
如果 sum 大于等于 s,
i 右移 sum 更新(sum 变小);
如果 sum 小于 s,
j 右移 sum 更新(sum 变大);
}
不断循环此过程 即可。

具体 C语言代码 如下(用 C++ 提交

#include<stdio.h>
int main(){
	int N, n, s;
	int a[100000];
	
	scanf("%d", &N);
	while(N--){
		int sum = 0, i, j;
		scanf("%d%d", &n, &s);
		int len = n;  //len 为 最短子序列 的长度  假设存在  初始化为n (便于更新) 
		for(i = 0; i < n; i++){
			scanf("%d", &a[i]);
			sum += a[i]; //sum 为 数组累加和  
		}

		
		if(sum < s) printf("0\n");  // 特殊情况 不存在 子序列  
		else {		
			i = 0;
			j = 0; // 左右端点 的 初始化
			sum = a[0]; // sum为 当前子序列的 长度 
			
			while( 1 ){
				if(sum >= s) {
					len = len < (j - i +1) ? len : (j - i + 1); // len 始终记录 最短子序列 的 长度 
					if(len == 1) break; //最短子序列长度 最小为 1  len为1  直接结束循环 
					sum -= a[i];  // sum 更新 
					i++;  // 左端点 右移
					if( i > n-1) break; // i 超界  结束循环 
				}
				
				else {
					j++;  // 右端点 右移 
					if(j > n-1) break; // j 超界  结束循环 
					sum += a[j];  // sum 更新 
				}
				
			}
			
			printf("%d\n", len); // 打印结果 
		} 
	} 
}
很抱歉,根据提供的引用内容,没有给出具体的逆波兰表达式POJ2694c语言代码。但是,我可以为您提供一些关于逆波兰表达式的基本知识和实现方法。 逆波兰表达式是一种将运算符放在操作数后面的表达式,也称为后缀表达式。逆波兰表达式的优点是可以直接通过栈来计算表达式的值,而不需要考虑运算符的优先级和括号的问题。 逆波兰表达式的计算方法如下: 1. 从左到右扫描表达式,遇到数字时,将数字压入栈中。 2. 遇到运算符时,弹出栈顶的两个数字,进行运算,并将结果压入栈中。 3. 重复上述步骤,直到表达式的最右端。 4. 最后栈中只剩下一个数字,即为表达式的值。 下面是一个简单的逆波兰表达式的实现代码: ```c #include <stdio.h> #include <stdlib.h> #include <ctype.h> #define MAX_STACK_SIZE 100 typedef struct { int top; int data[MAX_STACK_SIZE]; } Stack; void init(Stack *s) { s->top = -1; } int is_empty(Stack *s) { return s->top == -1; } int is_full(Stack *s) { return s->top == MAX_STACK_SIZE - 1; } void push(Stack *s, int x) { if (is_full(s)) { printf("Stack overflow\n"); exit(1); } s->data[++s->top] = x; } int pop(Stack *s) { if (is_empty(s)) { printf("Stack underflow\n"); exit(1); } return s->data[s->top--]; } int evaluate(char *expr) { Stack s; init(&s); while (*expr) { if (isdigit(*expr)) { push(&s, *expr - '0'); } else { int op2 = pop(&s); int op1 = pop(&s); switch (*expr) { case '+': push(&s, op1 + op2); break; case '-': push(&s, op1 - op2); break; case '*': push(&s, op1 * op2); break; case '/': push(&s, op1 / op2); break; default: printf("Invalid operator\n"); exit(1); } } expr++; } return pop(&s); } int main() { char expr[] = "34+2*"; int result = evaluate(expr); printf("%d\n", result); return 0; } ``` 这段代码实现了一个简单的逆波兰表达式求值程序,它可以计算表达式"3+4*2"的值,输出结果为11。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值