csp 19-03-1 小中大 &2 二十四点

小中大
问题

输入一组有序整数,输出最大值,中位数,最小值。如果有小数的话,四舍五入保留一位小数。

思路

数组有序,最值就在两头,比较头尾即可输出最大最小值。
中位数,需要判断数列奇偶情况,奇数直接输出num[n/2],偶数的话,输出,(num[ n / 2 ] + num[ n / 2 - 1 ]) / 2.0
int / .0 的话,结果的精度应该是和.0对其的,而且,因为是两个整数平均数,所以如果有小数的话,也只有.5的情况,所以我觉得自己这样处理是完全可以的,但是,事实不是,运行只有90分。还是在我又完善处理了,n=1的情况。也有看其他博主的方法,但我不认同,我觉得我就是对的,这个题也消耗我太多耐心,暂时先不管了。

#include <iostream>
#include <vector>
#include <iomanip>
using namespace std;

int main() {
	int n;
	cin >> n;
	vector<int> num(n);
	double median;
	int max, min;
	if( n == 1 ) {
		cin >> num[0];
		cout << num[0] << " " << num[0] << " " << num[0] << endl;
	}
	if( n > 1 ) {

		for(int i = 0; i < n; i++)
			cin >> num[i];

		if( num[0] >= num[n - 1] ) {
			max = num[0];
			min = num[n-1];
		} else {
			max = num[n-1];
			min = num[0];
		}
		cout << max << " ";

		if( n % 2 == 0 ) {
			cout << (num[ n / 2 ] + num[ n / 2 - 1 ]) / 2.0 << " ";
		} else
			cout << num[ n / 2 ] << " ";

		cout << min << endl;
	}
	return 0;
}
get

没有get,get到了伤心

二十四点
问题

输入n个表达式,求运算结果是不是24。

我的思路

用栈来做,扫描表达式,一个数字栈一个运算符栈,数字直接入栈,运算符判断后操作。
运算符优先级<= 栈顶,往前计算,弹出数字栈中的两个数字,弹出栈顶运算符,计算后结果入栈。
运算符优先级>栈顶,往后计算,再压入一个数字之后,弹出数字栈中的两个数字,弹出栈顶运算符,计算后结果入栈。

以上的太复杂了,如果没有括号,好像也不用比较优先级啥的,直接扫描,遇到数字入栈,遇到乘除就运算,遇到加减入栈,扫描完了之后,依次出栈运算。

优秀的思路

CCF试题 201903-2 二十四点
照自己以上的思路,运行样例结果是正确的,但是提交后只有30分,输出运算结果后,发现一个纯加减法的运算结果是错误,调试后发现是因为加减法在运算的时候,运算符号是右结合的,但如果采用栈的话,如果是7-9+8,运算的话,就是,8+9-7,运算符会往左结合,所以入栈的时候讲减号直接和数字结合入栈,也就是博主所说的,减法改造成加法。
以下代码基本和博主的一样,感谢博主优秀的代码,抱拳.gif

10
9+3+4x3
5+4x5x5
7-9-9+8
5x6/5x4
3+5+7+9
1x1+9-9
1x9-5/9
8/5+6x9
6x7-3x6
6x4+4/5
#include <iostream>
#include <stack>
#include <vector>
#include <string>
using namespace std;

int main() {
	stack<int> nums;
	stack<char> opts;
	int n;
	cin >> n;
	vector<int> ans(n);//保存结果,0 no,1 yes
	char opt;
	string str;
	for(int j = 0; j < n; j++) {
		cin >> str;
		for(int i = 0; i < 7; i++) {
			if (isdigit(str[i])) {
				nums.push(str[i] - '0');
			} else if (str[i] == '+') {
				opts.push(str[i]);
			} else if (str[i] == '-'){
				opts.push('+');
				nums.push(-(str[i+1]-'0'));
				i++;
			}
			 else if(str[i] == 'x') { //计算乘法
				int num1 = nums.top();
				nums.pop();
				nums.push(num1 * (str[i + 1] - '0'));
				i++;
			} else if(str[i] == '/') { //计算除法
				int num1 = nums.top();
				nums.pop();
				nums.push(num1 / (str[i + 1] - '0'));
				i++;
			}
		}
		while(!opts.empty()) {
			int num1 = nums.top();
			nums.pop();
			int num2 = nums.top();
			nums.pop();
			opt = opts.top();
			if(opt == '+')
				nums.push(num1 + num2);
			else nums.push(num2 - num1);
			opts.pop();
		}
		if(nums.top() == 24) {
			ans[j] = 1;
		} else ans[j] = 0;
		nums.pop();
	}
	for (int i = 0; i < n; i++) {
		if(ans[i] == 0) {
			cout << "No" << endl;
		} else cout << "Yes" << endl;
	}
	return 0;
}
get

表达式运算,用栈,应该是优先级高的先算,还有就是运算符号都是右结合的,不过这里因为乘除直接运算了,没有啥问题。全都入栈之后在运算的话,就要考虑运算符结合的问题了。

  • 7
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值