#include <iostream> #include <utility> #include <vector> using namespace std; int main() { int n; while (cin >> n) { vector<pair<int, int>> data(n); for (int i = 0; i < n; i++) { cin >> data[i].first >> data[i].second; } int i = 0; int sum = 0, num = 0; while (i < n) { int pos = i; int cnt = 0, sum10 = 0, candidate = 0; // 嵌套循环,寻找处于同一个 set 的元素 while (pos < n && data[pos].first == data[i].first) { // 如果元素的值小于等于10,更新备选值 // 如果元素的值大于10,更新数量以及和 if (data[pos].second <= 10) { candidate = max(candidate, data[pos].second); } else { sum10 += data[pos].second; cnt++; } // 寻找下一个位置 pos++; } // 如果大于10的元素数量存在,计算sum值 if (cnt > 0) { sum += sum10 - ((cnt - 1) * 10); num += cnt; } else { sum += candidate; num += 1; } // 将第一层循环移至第二层循环的位置 i = pos; } cout << sum << " " << num << endl; } return 0; }
时间复杂度:O(n),只遍历了一次数组
空间复杂度:O(n),存储数据