跳到主要内容

学术互助|CSP20160401 折点计数问题(C++11)评测结果只有90分

今天你写bug了么?

访问小组归档于 5/16/2025, 2:25:51 PM

学术互助|CSP20160401 折点计数问题(C++11)评测结果只有90分

题目:

给定n个整数表示一个商店连续n天的销售量。如果某天之前销售量在增长,而后一天销售量减少,则称这一天为折点,反过来如果之前销售量减少而后一天销售量增长,也称这一天为折点。其他的天都不是折点。如下图中,第3天和第6天是折点。

image

给定n个整数a1,a2, ...,an表示销售量,请计算出这些天总共有多少个折点。   为了减少歧义,我们给定的数据保证:在这n天中相邻两天的销售量总是不同的,即ai-1≠ai。注意,如果两天不相邻,销售量可能相同。 输入格式   输入的第一行包含一个整数n。   第二行包含n个整数,用空格分隔,分别表示a1,a2, ...,an。 输出格式   输出一个整数,表示折点出现的数量。 样例输入 7 5 4 1 2 3 6 4 样例输出 2 评测用例规模与约定   所有评测用例满足:1 ≤n≤ 1000,每天的销售量是不超过10000的非负整数。

我的答案:

#include #include using namespace std; using gg = long long; int main() { gg n, ai, before, next, cnt = 0, d1, d2; vector v; cin >> n; for (gg i = 0; i < n; i++) { cin >> ai; v.push_back(ai); } for (vector::iterator it = v.begin() + 1; it != v.end() - 1; it++) { before = *(it - 1); next = *(it + 1); //if ((before < *(it) && next < *(it)) || (before > *(it) && next > *(it))) //{ // cnt++; //} d1 = before - *(it); // 前一天与当天的差值 d2 = *(it)- next; // 当天与后一天的差值 if (d1 * d2 < 0) cnt++; } cout << cnt; return 0; }

评测结果只有90分,想请教各位大佬怎么修改才能得满分💯?

image

Fisherchenxi · 2023-08-17 · 15:15:28 江苏

几个建议:

  1. 用一个正规的代码分享平台,而不是直接贴上来源文件
  2. 如果要对 iterator 做运算,那不如直接用下标遍历
  3. (it) 出现了好几次,最好抽出来变成一个变量,也即是 current = it

"运行错误" 指的是 Runtime Error,显然是存在某些非法访问。你的代码在进入循环时要求 v 满足 v.size() >= 2,否则会出现问题。可以试试输入为 1 1 会发生什么。