#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),存储数据

京公网安备 11010502036488号