不做最后一个

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录


题目

农夫约翰有 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一般代表状态


                                

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值