五题中,第 1 题算法完全正确,却因一句 C++11 新语法在旧编译器下编译失败(CE),100 分整题归零。其余失分集中在边界遗漏、栈结构没存住、以及第 4 题空题。
题目求 \(\sum_{i=1}^{n}\max(0,\; k - a_i)\),旭扬写的逻辑完全正确,样例 10、边界都过。但他用了五份代码里唯一一处 C++11 写法 for(auto it : vc),在旧标准编译器下直接编译失败,判题端一个点都跑不出来 → 0 分。
supply 是五题里最简单的,但他准确抓住了"每盒补到 k 支"就是 Σ max(0,k−aᵢ),算法逻辑全对。这说明读题能力和最基础的求和建模已经过关。
board 他写出了 pArr.push_back / pop_back,说明他"知道这是个栈";rise 他枚举起点往后扫,也是经典做法。方向都对,败在细节没踩稳。
batch 的两个样例他都跑对了(23 和 11),说明他会拿样例自测、会输出结果。问题不在"不会验证",而在"样例过了就以为全过"。
for(auto it : vc) 范围 for 循环——这是 C++11 才有的语法。其余四题全是老式下标循环,所以唯独这题在旧编译器下编译失败。这是"工程规范"丢分,不是"不会做"丢分。$ g++ -std=c++98 supply.cpp supply.cpp:15:18: error: 'it' does not name a type rise / board / batch.cpp → 编译通过
#include <bits/stdc++.h>
using namespace std;
int main(){
ifstream fin("supply.in");
ofstream fout("supply.out");
int n, k; fin >> n >> k;
long long sum = 0;
for (int i = 0; i < n; i++) {
int x; fin >> x;
if (x < k) sum += k - x;
}
fout << sum;
return 0;
}
#include <bits/stdc++.h>
using namespace std;
int a[200005];
int main(){
ifstream fin("rise.in");
ofstream fout("rise.out");
int n; fin >> n;
for (int i = 0; i < n; i++) fin >> a[i];
int ans = 1, cnt = 1;
for (int i = 1; i < n; i++) {
if (a[i] > a[i-1]) cnt++;
else cnt = 1;
ans = max(ans, cnt); // 每一步都更新,不依赖 break
}
fout << ans;
return 0;
}
#include <bits/stdc++.h>
using namespace std;
int color[105];
vector<int> stk; // ★ 循环外声明,整轮操作共用
int main(){
ifstream fin("board.in");
ofstream fout("board.out");
int n, m; fin >> n >> m;
for (int i = 0; i < m; i++) {
int op; fin >> op;
if (op == 1) {
int p, c; fin >> p >> c;
color[p] = c;
stk.push_back(p);
} else {
int p = stk.back(); stk.pop_back();
color[p] = 0;
}
}
for (int i = 1; i <= n; i++) {
fout << color[i];
if (i < n) fout << ' ';
}
fout << endl;
return 0;
}
$ cat deliver.cpp
int main() {
ifstream fin("deliver.in");
fin >> n >> m >> B;
for (...) cin >> Map[i][j];
} // 函数直接结束:无 BFS、无距离、无 fout
#include <bits/stdc++.h>
using namespace std;
int n, m, B, sx, sy;
char g[505][505];
int d[505][505];
int dx[4]={-1,1,0,0}, dy[4]={0,0,-1,1};
int main(){
ifstream fin("deliver.in");
ofstream fout("deliver.out");
fin >> n >> m >> B;
vector<int> tx, ty;
for (int i = 0; i < n; i++) {
fin >> g[i];
for (int j = 0; j < m; j++) {
if (g[i][j] == 'S') {
sx = i; sy = j;
} else if (g[i][j] == 'T') {
tx.push_back(i);
ty.push_back(j);
}
}
}
memset(d, -1, sizeof(d));
queue<pair<int,int> > q;
d[sx][sy] = 0;
q.push(make_pair(sx, sy));
while (!q.empty()) {
int x = q.front().first;
int y = q.front().second;
q.pop();
for (int k = 0; k < 4; k++) {
int nx = x + dx[k];
int ny = y + dy[k];
if (nx < 0 || nx >= n || ny < 0 || ny >= m) continue;
if (g[nx][ny] == '#' || d[nx][ny] != -1) continue;
d[nx][ny] = d[x][y] + 1;
q.push(make_pair(nx, ny));
}
}
vector<int> dists;
for (int i = 0; i < (int)tx.size(); i++) {
int x = tx[i], y = ty[i];
if (d[x][y] != -1) dists.push_back(2 * d[x][y]);
}
sort(dists.begin(), dists.end());
int used = 0, ans = 0;
for (int i = 0; i < (int)dists.size(); i++) {
if (used + dists[i] <= B) {
used += dists[i];
ans++;
} else {
break;
}
}
fout << ans;
return 0;
}
#include <bits/stdc++.h>
using namespace std;
int a[10005], dp[10005];
int main(){
ifstream fin("batch.in");
ofstream fout("batch.out");
int n, k; fin >> n >> k;
for (int i=1;i<=n;i++) fin >> a[i];
dp[0] = 0;
for (int i=1;i<=n;i++){
dp[i] = INT_MAX;
int mx = 0;
for (int j=i; j>=max(1,i-k+1); j--){
mx = max(mx, a[j]);
dp[i] = min(dp[i], dp[j-1] + mx);
}
}
fout << dp[n];
return 0;
}
目标:下次考试 0 CE、0 编译警告。
目标:在线扫描类题不再漏末尾 case。
目标:看到网格最短路径立刻 BFS。
目标:建立"最后一段从哪切"的 DP 思维。