#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,还得自己手动++。