[2021-TKK 暑期训练第一场] 1585:下馆子-3
题目做了超链接
参考官方题解,作部分优化
下馆子 -3
题意:
给定n组数据,由name,time构成
- 当只有一个最大值时,输出该同学
- 当不止有一个最大值时,输出最先大于等于max次的同学
题解:
-
考虑用map<string,int>
-
遍历 map 计算出最大值mm
-
若最大值为mm的只有一个,直接输出
-
若不止一个,重新模拟一次输入,当出现出勤次数大于等于max时输出该人名
上板子:
#include <bits/stdc++.h> using namespace std; typedef long long ll; pair<string, int>r[100005]; int main() { map<string, int>p;//记录name以及time int n; cin >> n; string str; int mm = INT_MIN;//记录最终值中的最大值 bool num = 1;//若只有一个最大值,num=1;不止一个,num=0 for (int i = 0;i < n;i++) { string sq;int n; cin >> sq >> n; r[i] = { sq,n };//存储输入数据 p[sq] += n; } for (auto i : p)//遍历容器p { if (i.second > mm)//最终值大于 mm { mm = i.second; str = i.first;//记录此时的name,令str=name num = 1; } else if (i.second == mm) num = 0;//不止一个最大值 } if (num)cout << str;//若只有一个最大值 else { p.clear();//清空容器p for (int i = 0;i < n;i++)//重新遍历一次输入的数据 { string name = r[i].first; int time = r[i].second; p[name] += time; if (p[name] >= mm) { str = name; break; } } cout << str; } return 0; }
这次线上赛被吊锤了,下次努力吧QAQ
制作:BDT20040