1044 Shopping in Mars (25分)
边听歌边写,感觉写的很乱,结果一次就过了,意外之喜!
思路:采用双指针,j不断累加直至sum大于或等于price,判断并决定是否存入ans数组,然后退出循环,sum减去头和尾的值,i++,从尾处继续累加防止超时。。。
代码:
可读性有点差
#include<iostream>
#include<cstdio>
#include<vector>
#include<algorithm>
using namespace std;
int main() {
int n, price;
cin >> n >> price;
vector<int> num(n);
for (int i = 0; i < n; i++) {
cin >> num[i];
}
vector<pair<int, int> > ans;
int min = 1e9, sum = 0;
for (int i = 0, j = 0; i < n; i++) {
for (; j < n; j++) {
sum += num[j];
if (sum > price && sum <= min) {
ans.push_back({ i,j });
min = sum;
break;
}
else if (sum == price) {
if (min != price) { ans.clear(); }
ans.push_back({ i,j });
min = sum;
break;
}
else if (sum > price) { break; }
}
if (j < n) { sum -= (num[i] + num[j]); }//记得j<n判断,否则可能数组越界;
//此时的j为序列尾部处,因为break后j没有自增一;减去num[i]为了下一轮累加,减去num[j]防止i+1至j刚好符合的情况
}
for (auto i : ans) {
printf("%d-%d\n", i.first + 1, i.second + 1);
}
return 0;
}