酷代码 AI
菜单

在一个古老的部落里,有一个关于天气之子的试炼。 试炼将会给出连续 n n 天的天气情况。每种天气被一个正整数编号。相同的正整数表示同一种天气。 每一天前,接受天气之子试炼的成员们必须每天给出当天的天气预报。预报准确率最高的会成为部落的天气之子。 你想出了一个奇妙的预报方法: 第一天预报天气为 <天气类型1>。从第二天开始: 若前一天预报成功,预报的天气类型保持不变。 若预报失败,统计前面所有天中的最多的天气(多种天气都是最多时,预报其中该天气第一次出现最晚的天气种类),修改当天的预报为该天气。 你的任务是计算你的预报成功天数。 输入格式 第一行一个正整数 n n,表示一共有 n n 天进行天气预报。 接下来一行 n n 个正整数 a 1 . . . a n a 1 ​ ...a n ​ ,其中 a i a i ​ 表示第 i i 天的天气情况。相同的正整数表示相同的天气。 输出格式 一行一个正整数,表示预报成功的天数。 使用c++语言

```cpp #include <iostream> #include <vector> #include <unordered_map> using namespace std; int main() { int n; cin >> n; vector<int> weather(n); for (int i = 0; i < n; i++) { cin >> weather[i]; } // 第一天预报为天气1 int forecast = weather[0]; int correct = 0; // 记录每种天气的出现次数 unordered_map<int, int> count; // 记录每种天气第一次出现的最后位置 unordered_map<int, int> lastFirstOccurrence; for (int i = 0; i < n; i++) { // 检查预报是否正确 if (forecast == weather[i]) { correct++; } // 更新当前天气的计数 count[weather[i]]++; // 如果是第一次出现,记录位置 if (lastFirstOccurrence.find(weather[i]) == lastFirstOccurrence.end()) { lastFirstOccurrence[weather[i]] = i; } // 准备下一天的预报(如果是最后一天则不需要) if (i < n - 1) { if (forecast != weather[i]) { // 预报失败,需要修改预报 int maxCount = 0; int bestWeather = -1; int latestFirstOccurrence = -1; // 找出出现次数最多的天气 for (auto& entry : count) { int w = entry.first; int c = entry.second; int firstOccur = lastFirstOccurrence[w]; if (c > maxCount) { maxCount = c; bestWeather = w; latestFirstOccurrence = firstOccur; } else if (c == maxCount) { // 出现次数相同,选择第一次出现最晚的 if (firstOccur > latestFirstOccurrence) { bestWeather = w; latestFirstOccurrence = firstOccur; } } } forecast = bestWeather; } // 如果预报成功,forecast保持不变 } } cout << correct << endl; return 0; } ``` 代码说明: 1. 初始化第一天的预报为实际天气1 2. 遍历每一天: - 检查预报是否正确,统计正确天数 - 更新天气计数和首次出现位置 - 如果不是最后一天且预报失败,重新计算预报: * 找出出现次数最多的天气 * 次数相同时选择第一次出现最晚的天气 3. 输出正确预报的天数 时间复杂度:O(n²)(最坏情况每次都需要遍历count map) 空间复杂度:O(n) [2026-01-19 19:17:32 | AI问答 | 591点数解答]

服务商
相关提问
发财导航,免费问AI
实用工具查看更多