牛客-数组、字符串及数据批量存储 2022.10.8

小y的考试

普通模拟,对于三长一段,三短一长的两种情况进行特殊判断,这里写的是:

  • 三长一短,最短的小于其他三个,其他三个关系可以是小于大于等于
  • 三短一长,最长的大于其他三个,其他三个关系可以是小于大于等于

其他情况都是参差不齐

#include <bits/stdc++.h>
using namespace std;
int main() {
    int t;
    cin >> t;
    while(t--) {
        string a, b, c, d;
        cin >> a >> b >> c >> d;
        int alen = a.size() - 2, blen = b.size() - 2, clen = c.size() - 2, dlen = d.size() - 2;
        vector<int> p;
        p.emplace_back(alen), p.emplace_back(blen), p.emplace_back(clen), p.emplace_back(dlen);
        sort(p.begin(), p.end());
        if(p[1] > p[0] && p[1] <= p[2] && p[2] <= p[3]) {
            if(p[0] == alen)
                cout << "A\n";
            if(p[0] == blen)
                cout << "B\n";
            if(p[0] == clen)
                cout << "C\n";
            if(p[0] == dlen)
                cout << "D\n";
        } else if(p[0] <= p[1] && p[1] <= p[2] && p[2] < p[3]) {
            if(p[3] == alen)
                cout << "A\n";
            if(p[3] == blen)
                cout << "B\n";
            if(p[3] == clen)
                cout << "C\n";
            if(p[3] == dlen)
                cout << "D\n";
        } else
            cout << "C\n";
    }
    return 0;
}

[NOIP2000]计算器的改良

将方程式分为左边和右边两个部分,分别计算记录左右两边各自的符号数值和与常数数值和。再对结果为零的两种情况分别进行特判,最后按照要求输出结果即可。

#include <bits/stdc++.h>
using namespace std;
int main() {
    string s;
    cin >> s;
    //左边符号前的数值和 左边的常数数值和
    int lefta = 0, num2 = 0;
    //右边符号前的数值和 右边的常数数值和
    int righta = 0, num4 = 0;
    int idx = 0;
    bool neg = false;
    int sum = 0;
    char letters;
    //统计等号左边的符号前数值和常数数值和
    for(int i = 0; i < s.size(); i++) {
        //如果为等号,说明方程左边结束
        if(s[i] == '=') {
            idx = i;
            break;
        }
        //如果是数字,统计数字大小
        if(s[i] >= '0' && s[i] <= '9') {
            if(i > 0) {
                if(s[i - 1] == '-')
                    neg = true;
            }
            while(i < s.size() && s[i] >= '0' && s[i] <= '9')
                sum = sum * 10 + s[i] - '0', i += 1;
            if(neg)
                sum = sum * (-1);
            //如果是符号前的数值 否则是常数数值
            if(i < s.size() && s[i] >= 'a' && s[i] <= 'z')
                lefta += sum, letters = s[i];
            else
                num2 += sum;
            sum = 0;
            neg = false;
            i -= 1;
        }
    }
    //方程式右边,处理操作同上
    for(int i = idx + 1; i < s.size(); i++) {
        if(s[i] >= '0' && s[i] <= '9') {
            if(i > idx + 1) {
                if(s[i - 1] == '-')
                    neg = true;
            }
            while(i < s.size() && s[i] >= '0' && s[i] <= '9')
                sum = sum * 10 + s[i] - '0', i += 1;
            if(neg)
                sum = sum * (-1);
            if(i < s.size() && s[i] >= 'a' && s[i] <= 'z')
                righta += sum, letters = s[i];
            else
                num4 += sum;
            sum = 0;
            neg = false;
            i -= 1;
        }
    }
    //如果符号数值和常数数值有一个两边相等,进行特判
    if(righta == lefta || num2 == num4) {
        printf("%c=0.000\n", letters);
        return 0;
    }
    printf("%c=%.3lf\n",letters ,1.0 *(num2 - num4) / (1.0 * (righta - lefta)));
    return 0;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值