CCF 201903-1 小中大 CCF 201903-2 二十四点

CCF 201903-1 小中大

CCF 201903-1 小中大 CCF 201903-2 二十四点_第1张图片

思路

题意比较明确:给定一组有序的数据,求最大最小中位数并按照从大到小的顺序输出
若总数为奇数,则中位数为中间的数,若为偶数,则为中间两个数的平均数。

代码实现

#include 
#include 
#include 

using namespace std;

const int N = 100010;

int n;
int q[N];

int main()
{
    scanf_s("%d", &n);
    for (int i = 0; i < n; i++) scanf_s("%d", &q[i]);
    int res[3];//存储最大最小中位数
    res[0] = q[0] * 2, res[1] = q[n - 1] * 2;//先乘2后除2来判断奇数偶数
    if (n % 2) res[2] = q[n / 2] * 2;//若为奇数项,中位数为中间的数
    else res[2] = q[n / 2 - 1] + q[n / 2];

    sort(res, res + 3);//最大最小中位数排序后输出
    for (int i = 2; i >= 0; i--)
        if (res[i] % 2) printf("%.1lf ", res[i] / 2.0);//保留一位小数
        else printf("%d ", res[i] / 2);
    return 0;
}
//海大海之子老哥考研QQ:1151039635

CCF 201903-2 二十四点

CCF 201903-1 小中大 CCF 201903-2 二十四点_第2张图片

思路

题意比较清晰,经典的表达式求值问题。注意负数相除的时候向下取整,即-3/7=-1。本题属于模板题,可以背过。
使用栈来存储,看栈顶元素的优先级和入栈元素运算符的关系,若栈顶优先级大于等于入栈元素,则栈顶要计算。
此题还是挺难的,那么从2-5题都很难,所以当年平均分在106分,基本就是只做出第一道题…,所以不要慌,难的大家都难,只是你要尽力拿分。

代码实现

#include 
#include 
#include 
#include 
#include 

using namespace std;

stack<int> num;//数字1-9
stack<char> op;//运算符+-*/

void eval()
{
    int b = num.top(); num.pop();//取出栈顶元素并弹出
    int a = num.top(); num.pop();//取出次栈顶元素并弹出
    char c = op.top(); op.pop();//取出运算符
    int x;//结果
    if (c == '+') x = a + b;
    else if (c == '-') x = a - b;
    else if (c == 'x') x = a * b;
    else
    {
        //若为除法,则需要注意为向下取整,而非向0取整
        if (a * b >= 0) x = a / b;//a和b同号
        else  // C++中a/b是向零取整,而当前为向下取整,即-3/7=-1。
        {
            if (a % b == 0) x = a / b;
            else x = a / b - 1;
        }
    }
    num.push(x);
}

int main()
{
    unordered_map<char, int> pr;//运算符优先级存入表中
    pr['+'] = pr['-'] = 1;//加减相同
    pr['x'] = pr['/'] = 2;
    int n;
    cin >> n;
    while (n--)
    {
        string str;
        cin >> str;//读入一组字符串数据
        num = stack<int>();//栈清空
        op = stack<char>();
        //从前往后枚举每个字符
        for (auto c : str)
            if (c >= '0' && c <= '9') num.push(c - '0');//若为数字字符则转换为数字并存入栈中
            else
            {
                //看一下优先级顺序:若栈顶有运算符,且优先级大于等于当前元素优先级,则eval操作栈顶两个元素,若加法则按照加法计算值并返回
                while (op.size() && pr[op.top()] >= pr[c]) eval();
                op.push(c);//当前运算符入栈
            }
        while (op.size()) eval();//计算所有运算符
        if (num.top() == 24) puts("Yes");//最终栈顶元素即最终结果
        else puts("No");
    }
    return 0;
}

//海大海之子考研老哥QQ:1151039635

CCF 201903-1 小中大 CCF 201903-2 二十四点_第3张图片

你可能感兴趣的:(CCF代码每日一练,算法,数据结构,c++)