提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
题目
农夫约翰有 77 头奶牛:Bessie,Elsie,Daisy,Gertie,Annabelle,Maggie,Henrietta。
他每天都给它们挤奶,并详细记录每次挤奶过程中每头牛的产奶量。
毫无疑问,产奶量大的奶牛会受到约翰的高度赞扬。
牛是一种懒惰的动物,并不愿意产出过多的牛奶。
对于它们来说,每头牛都十分乐意成为牛群中产奶量最低的奶牛。
然而,他们不断听到约翰和他的人类朋友提到“从农场到餐桌”这句话,虽然不知道是什么意思,但他们怀疑,实际上,奶牛产奶量最低并不是最好的主意。
取代这一想法的是,它们认为在牛群中产奶量第二低的位置相对来说更为安全。
请帮助奶牛们搞清楚哪头奶牛目前处在这个相对理想的位置。
输入格式
第一行包含整数 NN,表示共有 NN 条挤奶记录。
接下来的 NN 行,每行都包含一头奶牛的名字(上述七头之一),后跟一个正整数(不超过 100100),表示该头奶牛在一次挤奶过程中产生的奶量。
完全没有在记录中出现过的奶牛的产奶量视为 00。
输出格式
在一行中输出产奶量第二低的奶牛的名字。
更准确的说,假设 MM 是所有奶牛中产奶量的最小值,那么请输出所有产奶量超过 MM 的奶牛中产奶量最小的那头奶牛的名字。
如果有很多头奶牛满足这一条件,或者没有奶牛满足这一条件(即所有奶牛的产奶量都为 MM),请输出 Tie
。
如果某头奶牛完全没有在挤奶记录中出现过,则 M=0M=0,因为那头奶牛根本就没有产奶。
提示:以下是本篇文章正文内容,下面案例可供参考
一、输入输出数据,数据范围
数据范围
1≤N≤1001≤N≤100
输入样例:
10
Bessie 1
Maggie 13
Elsie 3
Elsie 4
Henrietta 4
Gertie 12
Daisy 7
Annabelle 10
Bessie 6
Henrietta 5
输出样例:
Henrietta
样例解释
在此样例中,Bessie,Elsie,Daisy 的产奶量为 77,并列产奶量最低,除了它们三个以外,产奶量最低的是 Henrietta,其产奶量为 99。
难度:简单 |
时/空限制:1s / 64MB |
总通过数:1482 |
总尝试数:3682 |
来源:USACO 2017 January Contest Bronze |
算法标签 |
挑战模式
二、代码
#include <iostream>
#include <cstring>
#include <algorithm>
#include<unordered_map>
using namespace std;
int main()
{
unordered_map<string,int>hash={{"Bessie",0},
{"Elsie",0},
{"Daisy",0},
{"Gertie",0},
{"Annabelle",0},
{"Maggie",0},
{"Henrietta",0}};
int n;scanf("%d",&n);
while (n -- ){
string name;int p;
cin>>name>>p;
hash[name]+=p;
}
vector<int>data;
for(auto [a,b]:hash)
data.push_back(b);
sort(data.begin(),data.end());
data.erase(unique(data.begin(),data.end()),data.end());
if(data.size()==1)
puts("Tie");
else {
int x=data[1];
string name;
int cnt=0;
for(auto &[a,b]:hash)
if(b==x)
{
name=a;
cnt++;
}
if(cnt>1)puts("Tie");
else cout<<name;
}
return 0;
}
总结
1.sort()函数和unique()函数都是algorithm,头文件中包含的函数。
既然是封装到algorithm中的函数,所以既可以使用到数组又可以使用到容器中。
两个函数在使用的时候都是左闭又开的情况
sort 函数功能是排序。
注意:概念 unique 的作用是 去重 。 即“删除”序列中 重 复的相邻元素, 此处的删除不是真正的删除, 而是让不 重 复元素替换掉 重 复元素所在的位置。 由于它是”删除”相邻的元素, 所以在使用 unique 之前, 一般要给序列 排序 。没有排序只能够去掉相邻的重复元素。
(1)元素是基本数据类型,可以不用写cmp函数,默认的是从小到大的排序。想要从大到小必须自己写cmp函数
(2)元素是结构体或类时,必须要自己书写cmp函数
unique 函数功能是将数组中的重复元素放到后边,最后返回的是不重复元素的下一个元素位置。
2.#include<unordered_map>采用的是哈希表
哈希表的元素也是pair,即以键——值的形式。
哈希表的优点呼之欲出:通过关键值计算直接获取目标位置,对于海量数据中的精确查找有非常惊人的速度提升,理论上即使有无限的数据量,一个实现良好的哈希表依旧可以保持O (1)的查找速度,而O (n)的普通列表此时已经无法正常执行查找操作(实际上不可能,受到JVM可用内存限制,机器内存限制等)。 在工程上,经常用于通过名称指定配置信息、通过关键字传递参数、建立对象与对象的映射关系等。
哈希表的缺点:对于刻意模拟的数据可会引发哈希冲突
这道题通过名字作为下标,通过函数找到对应的小标hash[name]+=p;
2.因为这里边涉及到了,没有出现就信息会将所有的默认为挤奶量为0,用到了初始化。
unordered_map<string,int>hash={{"Bessie",0}, {"Elsie",0}};。其他的可以插入
3.eraser是容器中特有的,是将容器的从开始到
data.erase(unique(data.begin(),data.end()),data.end());
erase()将从开始到结束的位置的数据删除
4.如果输出的是字符串,最好使用puts.默认的自己输出一个回车
5.for循环中auto的使用
for(auto [k,v]:hash)
如果auto关键字不带上&号,则去除const语意。hash的数值可以发生改变
for(auto &[k,v]:hash)
如果auto关键字带上&号,则不去除const语意。
[k,v]是因为有两个数值
for(auto c:v)有一个数值
果auto关键字不带上&号,则去除const语意。
for(auto &c:v)有一个数值
如果auto关键字带上&号,则不去除const语意。
6.vector 可以初始化 可以使用push_back 可以使用insert(pos,)
7,变量规范 res一般是result
cnt一般是count
k,v
vis一般代表状态