题解
【入门】成绩
3 条题解
-
0
#include <bits/stdc++.h> using namespace std; /* 【解题思路】 咱们这次用的是“名单对号入座”的办法: 1. 建立空表:a[i] 存第 i 门课的代码,s[i] 存这门课的成绩。 刚开始,咱们把所有成绩 s[i] 都填上 -1,代表“还没录入”。 2. 查找更新:每来一条成绩信息 (p, s1),咱们就去 a 数组里找这个代码。 找到了在第几个位置,就在 s 数组对应的位置把 -1 改成实际分数 s1。 (如果有多次更新,新分数会自动把旧分数覆盖掉,非常省心!) 3. 统计结果: - 旷考:s[i] 还是 -1 的,说明名单上这门课没成绩。 - 不及格:s[i] 是 -1 或者小于 60 分的,通通算在内。 */ int n, m, sum1, sum2; // sum1存旷考,sum2存不及格 long long a[5005], s[5005]; int main() { // 读入课程总数 n 和信息条数 m if(!(cin >> n >> m)) return 0; for (int i = 1; i <= n; i++) { cin >> a[i]; // 记下每门课的“身份证号” s[i] = -1; // 初始化成绩为 -1(表示旷考) } // 循环 m 次处理成绩信息 while (m--) { long long p, s1; // p是代码,s1是分数 cin >> p >> s1; // 核心:在名单里挨个找,看看这分数是谁的 for (int i = 1; i <= n; i++) { if (p == a[i]) { s[i] = s1; // 找到了,对号入座改成绩 break; } } } // 最后扫一遍名单,数数不及格和旷考的人数 for (int i = 1; i <= n; i++) { if (s[i] == -1) { sum1++; // 还是 -1,说明旷考了 } if (s[i] == -1 || s[i] < 60) { sum2++; // 没考或者考砸了,都不及格 } } cout << sum1 << endl << sum2 << endl; return 0; } -
0
#include<bits/stdc++.h> using namespace std; int a[100005]; int d[100005]; int main(){ int n,p; cin>>n>>p; // 输入每个同学的初始成绩 for(int i=1;i<=n;i++){ cin>>a[i]; } // 构造差分数组 // d[i]表示第i个成绩和前一个成绩的差值 for(int i=1;i<=n;i++){ d[i]=a[i]-a[i-1]; } // p次调整 while(p--){ int x,y,z; cin>>x>>y>>z; // x到y全部增加z // 只修改两个位置 d[x]+=z; d[y+1]-=z; } // 通过前缀和还原最终成绩 for(int i=1;i<=n;i++){ d[i]=d[i-1]+d[i]; } // 找最低分 int minn=d[1]; for(int i=2;i<=n;i++){ minn=min(minn,d[i]); } cout<<minn; return 0; }
- 1