PAT (Basic Level) 1012 数字分类 (20 point(s))

#include <bits/stdc++.h>
using namespace std;
int main() {
    int n, x, space = 0;
    queue<int> A[6];
    cin >> n;
    // +1以实际序号储存 读取Ai时方便对应编号
    while(cin >> x)
        A[x % 5 + 1].push(x);
    for(int i = 1; i <= 5; i++){
        int size = A[i].size(), minus = 1;
        double ans = 0;
        if(A[i].empty() == true)
            cout << (space++ == 0 ? "" : " ") << 'N';
        else{
            while(A[i].empty() == false){
                int a = A[i].front(); A[i].pop();
                if(i == 1){
                    if(a % 2 == 0)
                        ans += a;
                }
                else if(i == 2){
                    ans += a * (minus++ % 2 ? 1 : -1);
                }
                else if(i == 3){
                    ans = size;
                }
                else if(i == 4){
                    ans += a;
                }
                else if(i == 5){
                    ans = max((int)ans, a);
                }
            }
            // A1非空不一定结果存在 如果只有奇数处理会得到0 也算结果不存在
            if(i == 1 && ans == 0)
                cout << (space++ == 0 ? "" : " ") << 'N';
            else if(i == 4)
                cout << fixed << setprecision(1) << " " << ans / size;
            else
                cout << (space++ == 0 ? "" : " ") << (int)ans;
        }
    }
}
#include <bits/stdc++.h>
using namespace std;
int main() {
    int n, x, minus = 1, size[5]{0}, space = 0;
    double A[5]{0};
    cin >> n;
    while(cin >> x){
        int i = x % 5;
        if(i == 0){
            if(x % 2 == 0)
                A[i] += x, size[i]++;
        }
        else if(i == 1){
            A[i] += x * (minus++ % 2 ? 1 : -1), size[i]++;
        }
        else if(i == 2){
            A[i]++, size[i]++;
        }
        else if(i == 3){
            A[i] += x, size[i]++;
        }
        else if(i == 4){
            A[i] = max((int)A[i], x), size[i]++;
        }
    }
    for(int i = 0; i < 5; i++){
        // 没有数一定没有结果
        if(size[i] == 0)
            cout << (space++ == 0 ? "" : " ") << 'N';
        // A1非空不一定结果存在 如果只有奇数处理会得到0 也算结果不存在
        else if(i == 0 && A[i] == 0)
            cout << (space++ == 0 ? "" : " ") << 'N';
        else if(i == 3)
            cout << fixed << setprecision(1) << " " << A[i] / size[3];
        else
            cout << (space++ == 0 ? "" : " ") << (int)A[i];
    }
}

之前都是先参考代码,然后默写。这次试试不参考,发现自己解题的过程有挺多问题。首先输出结果,应该一个个分步解决,不应该同时写五个处理代码。这暴露了解题过程中缺乏具体的分析思路,应该试着用注释将不同的问题解决的代码分块,分别思考和处理。


if(i == 1)
        if(a % 2 == 0)
                ans += a;

if(i == 1)
        if(x % 2 == 0)
                A[i] += x, size[i]++;
else if(i == 2)

 if(i == 1)
        if(x % 2 == 0)
                A[i] += x, size[i]++;
        else if(i == 2)

 当时这个判断没有加上大括号,以为if 和 else if 可以平行,但else如果没有括号那么应该跟着最近的if所以如果不加大括号实际else匹配第二个if,就错了。所以写多平行关系并且包含多个if选择判断的,不能不加大括号。

if(i == 1 && ans == 0)
        cout << (space++ == 0 ? "" : " ") << 'N';
else if(i == 4)
        cout << fixed << setprecision(1) << " " << ans / size;
else
        cout << (space++ == 0 ? "" : " ") << (int)ans;

如果是这种单行代码,就可以不考虑大括号。


(minus++ % 2 ? 1 : -1)

刚开始写的时候,想设 minus = -1;minus *= minus; 以为能不断读取数据,改变变量的正负符号。但实际 -1 * -1 = 1 就变成正的了。同时x不断改变,所以想加负号在读取的数据上面显然不对。

所以将正负符号独立出来,代码块里通过当前序号,交错读取正负符号。

(minus++ & 1 ? 1 : -1)

这个还可以写成这形式,用位与运算,偶数时10&01=00,奇数01&01=01。


stl容器用惯了发现,原来普通数组不自带元素个数size,还得自己手动++。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值