语文老师总是写错成绩,所以当她修改成绩的时候,总是累得不行。她总是要一遍遍地给某些同学增加分数,又要注意最低分是多少。你能帮帮她吗? 第一行有两个整数 nn,pp,代表学生数与增加分数的次数。 第二行有 nn 个数,a_1 \sim a_na 代表各个学生的初始成绩。 接下来 pp 行,每行有三个数,xx,yy,zz,代表给第 xx 个到第 yy 个学生每人增加 zz 分。 输出仅一行,代表更改分数后,全班的最低分。对于 40\%40% 的数据,有 n \le 10^3n≤10 3对于 60\%60% 的数据,有 n \le 10^4n≤10 4对于 80\%80% 的数据,有 n \le 10^5n≤10 对于 100\%100% 的数据,有 n \le 5\times 10^6n≤5×10 ,p \le np≤n,学生初始成绩 \le 100≤100,z \le 100z≤100。用python编写代码解决相关问题要求时间和内存尽可能小
时间: 2024-04-09 08:27:16 浏览: 60
为了尽可能减小时间和内存的使用量,可以使用以下代码来解决问题:
```python
import sys
n, p = map(int, input().split())
scores = list(map(int, input().split()))
min_score = min(scores) # 记录初始最低分
for _ in range(p):
x, y, z = map(int, input().split())
for i in range(x-1, y): # 更新分数范围内的学生分数
scores[i] += z
min_score = min(min_score, scores[i]) # 更新最低分
print(min_score)
```
这段代码的优化点包括:
1. 在循环中直接更新分数并同时更新最低分,避免了额外的存储开销。
2. 使用 `sys` 模块来提高输入输出的速度和效率。
3. 仅记录最低分,而不是每次都重新计算整个班级的最低分。
这样,代码在尽可能小的时间和内存消耗下解决了问题。
相关问题
语文老师总是写错成绩,所以当她修改成绩的时候,总是累得不行。她总是要一遍遍地给某些同学增加分数,又要注意最低分是多少。你能帮帮她吗? 第一行有两个整数 nn,pp,代表学生数与增加分数的次数。 第二行有 nn 个数,a_1 \sim a_na 代表各个学生的初始成绩。 接下来 pp 行,每行有三个数,xx,yy,zz,代表给第 xx 个到第 yy 个学生每人增加 zz 分。 输出仅一行,代表更改分数后,全班的最低分。用python编写代码解决相关问题
可以使用以下代码来解决这个问题:
```python
n, p = map(int, input().split())
scores = list(map(int, input().split()))
for _ in range(p):
x, y, z = map(int, input().split())
for i in range(x-1, y):
scores[i] += z
min_score = min(scores)
print(min_score)
```
首先,读取学生数和增加分数的次数。然后,读取学生的初始成绩,并将它们存储在一个列表中。
接下来,根据增加分数的次数循环。读取每次增加分数的范围和增加的分数,并在相应的范围内更新学生的成绩。
最后,使用 `min()` 函数找到更新后的成绩列表中的最低分,并将其打印出来。
共有n名学生的语文成绩要登记,目前登记的成绩是a[1],a[2],…,a[n]。但是语文老师lester写错了不少成绩,所以他要修改成绩的时候,总是累得不行。现在他要修改p次:每次修改行为由三个数字x,y,z表示,代表第x个到第y个学生每人增加z分。他总是要一遍遍地给某些同学增加分数,又要注意最低分是多少。你能帮帮他吗 输入输出格式 输入格式 第一行有两个正整数n和p(p<=n<=500000),代表学生数与加分次数 第二行有n个正整数,a[1],a[2],…a[n],代表各个学生的初始成绩(均不超过100) 接下来p行,每行有三个正整数,x,y,z,代表给第x个到第y个学生每人增加z分(x,y<=n, z<=100)。注意x可能大于y。 输出格式 输出一行,代表更改分数后,全班的最低分是几分。
以下是 C++ 的代码实现:
```cpp
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 500010;
int n, m;
int a[N];
int tr[N << 2];
void pushup(int u) {
tr[u] = min(tr[u << 1], tr[u << 1 | 1]);
}
void build(int u, int l, int r) {
if (l == r) tr[u] = a[l];
else {
int mid = l + r >> 1;
build(u << 1, l, mid), build(u << 1 | 1, mid + 1, r);
pushup(u);
}
}
void modify(int u, int l, int r, int x, int y, int k) {
if (l >= x && r <= y) tr[u] += k;
else {
int mid = l + r >> 1;
if (x <= mid) modify(u << 1, l, mid, x, y, k);
if (y > mid) modify(u << 1 | 1, mid + 1, r, x, y, k);
pushup(u);
}
}
int query(int u, int l, int r, int x, int y) {
if (l >= x && r <= y) return tr[u];
else {
int mid = l + r >> 1, res = 0x3f3f3f3f;
if (x <= mid) res = min(res, query(u << 1, l, mid, x, y));
if (y > mid) res = min(res, query(u << 1 | 1, mid + 1, r, x, y));
return res;
}
}
int main() {
cin >> n >> m;
for (int i = 1; i <= n; i++) cin >> a[i];
build(1, 1, n);
while (m--) {
int l, r, k;
cin >> l >> r >> k;
modify(1, 1, n, l, r, k);
}
cout << query(1, 1, n, 1, n) << endl;
return 0;
}
```
算法流程:
1. 读入数据,建立线段树,每个节点维护区间最小值。
2. 对于每次操作,将对应区间的值修改,然后更新线段树。
3. 最后输出整个区间的最小值。
时间复杂度:$O(m \log n)$。
阅读全文