2024年莆田市第四期C++专项第三轮选拔真题(初中组) 买米问题 题解
初始代码分析
-
首先将店铺的初始米价进行排序。
-
使用一个循环找到初始时最多可以购买的店铺数量pos,即sum + a[pos+1]不超过m的最大pos。
-
然后进入另一个循环,每天增加day,并累加当天能购买的米袋数pos到res中。
-
在每天结束后,检查sum + day * pos是否超过m,如果超过,则减少pos,并调整sum。
问题分析
该代码的思路是正确的,但在处理大规模数据时会超时,原因在于:
-
时间复杂度较高:外层循环最多进行n次,内层循环在最坏情况下也可能进行n次,导致时间复杂度接近O(n2),对于n=2×105来说,这样的复杂度无法在时间限制内完成。
-
逐天模拟效率低:虽然模拟每一天的购买情况直观,但对于大范围的day来说,逐天计算显然不够高效。
C++ 70分代码
#include <bits/stdc++.h>
#define ll long long
using namespace std;
int a[200005];
int main() {
ll n,m;
cin >> n >> m;
for(int i=1;i<=n;i++){
cin >> a[i];
}
sort(a+1,a