码题集OJ-小码哥的艰难选择 (matiji.net)
思想
我刚开始是这样写的,只能过3个数据:
#include<bits/stdc++.h>
using namespace std;
#define int long long
int n;
const int N = 110;
struct Point
{
int id;
string name;
int cj;
}a[N];
bool cmp(struct Point a,struct Point b)
{
if (a.cj == b.cj)return a.id < b.id;
return a.cj < b.cj;
}
signed main()
{
cin >> n;
for (int i = 1; i <= n; i++)
{
a[i].cj = 1000;
}
for (int i = 1; i <= n; i++)
{
int num;
cin >> a[i].name >> num;
a[i].id = i;
a[i].cj += num;
}
sort(a,a+n,cmp);
cout << a[1].name << endl<<a[1].cj;
return 0;
}
这样写可以全部过:
#include<bits/stdc++.h>
using namespace std;
int n; // 存储输入的数量
map<string, int> mp; // 用于存储姓名和数量的映射
// 比较函数,用于排序
bool cmp(pair<string, int>a, pair<string, int>b) {
return a.second < b.second; // 按数量从小到大排序
}
int main() {
cin >> n; // 输入数量
for (int i = 0; i < n; i++) {
string name;
int num;
cin >> name >> num; // 输入姓名和数量
mp[name] += num; // 累加数量到对应的姓名
}
// 遍历unordered_map,将每个值增加1000
for (auto it = mp.begin(); it != mp.end(); ++it) {
it->second += 1000;
}
// 将unordered_map的内容复制到vector中
vector<pair<string, int>> v(mp.begin(), mp.end());
// 使用比较函数排序vector
sort(v.begin(), v.end(), cmp);
// 输出排序后的第一个元素的姓名和数量
cout << v[0].first << endl << v[0].second << endl;
return 0;
}