11243: 【原1243】我有特别的微调技巧
题目
题目描述
author: Ted Yin 原OJ链接:https://acm.sjtu.edu.cn/OnlineJudge-old/problem/1243
Description
又到了期末评分的时候了。X老师总是为打分这件事感到发愁,这是因为如果同学们分数都偏高或者偏低,领导就会请自己喝茶。
因此为了确保分数呈现正态分布,X老师决定对分数进行微调。假设班上的分数按照学号排成一个数列,X老师拥有特别的微调技巧。作为他忠实助教的你,需要编写一个微调系统。 需要实现的操作如下:
0 l r -- 将学号l到r之间(包含两端,下同)所有同学的成绩的算术平均输出;
1 l r -- 将l到r之间所有同学的最高分输出;
2 l r -- 将l到r之间所有同学的成绩翻转,即l同学成绩变为r同学成绩,l+1同学的变为r-1的,以此类推;
3 l r -- 依次输出l到r之间所有同学的成绩,用空格分开;
4 l r -- 将l到r之间所有同学的成绩下调1,若已经是0分则不变。
Input Format
第一行是两个整数n, m,分别是班上人数和操作次数。
第二行有n个非负整数,依次是0号同学到n-1号同学的初始成绩。
从第三行开始,每行有三个整数 opt l r,表示操作类型以及对应的区间。
0 < n <= 1000
0 < m <= 2000
0 <= l <= r < n
0 <= opt < 5
Output Format
对于每个带有输出的操作,输出相应的值(平均值保留两位小数)。
Sample Input
10 6
0 1 2 3 4 5 6 7 8 9
0 0 9
2 0 4
1 2 5
4 0 9
2 0 9
3 0 9
Sample Output
4.50
5
8 7 6 5 4 0 0 1 2 3
ligongzzz's solution
#include "iostream"
#include "cstdio"
using namespace std;
int val_data[1009] = { 0 };
int main() {
int n, m;
scanf("%d %d", &n, &m);
for (int i = 0; i < n; ++i) {
scanf("%d", &val_data[i]);
}
for (; m > 0; --m) {
int opt, l, r;
scanf("%d %d %d", &opt, &l, &r);
if (opt == 0) {
double ans = 0.0;
for (int i = l; i <= r; ++i)
ans += double(val_data[i]);
printf("%.2f\n", ans / (r - l + 1));
}
else if (opt == 1) {
int cur_max = 0;
for (int i = l; i <= r; ++i) {
cur_max = val_data[i] > cur_max ? val_data[i] : cur_max;
}
printf("%d\n", cur_max);
}
else if (opt == 2) {
for (; l < r; ++l, --r) {
swap(val_data[l], val_data[r]);
}
}
else if (opt == 3) {
printf("%d", val_data[l]);
for (int i = l + 1; i <= r; ++i)
printf(" %d", val_data[i]);
printf("\n");
}
else if (opt == 4) {
for (int i = l; i <= r; ++i) {
if (val_data[i] > 0)
--val_data[i];
}
}
}
return 0;
}