c++之pair

文章介绍了C++中的pair数据结构,以及如何在实际编程中使用pair简化操作,特别是在处理极端数值对时。接着通过实例展示了在纸牌游戏中如何利用pair计算最高积分。同时提到了两道编程题目及其解法,展示了在不同场景下的代码实现。
摘要由CSDN通过智能技术生成

Lecture 40: pair

不知道大家逛超市时有没有看见过一些搞活动的牛奶,经常会捆在一起卖,大的绑小的,捆在一起,c++中的pair就是这样的东西,我们对比一下:

【大】(小)                                                                           (first)(second)

pair的诞生是因为有些数值非常极端(一个极大一个极小),导致整理起来十分麻烦,要把“极大”与“极小”分开算很是费劲,也很费时,极端情况下会TLE,所以才诞生了pair。

pair有两段——first和second,通常有sort需要的为first,没需求的为second,不用sort就还是别用pair了。函数也没多少,就make_pair()和一些冷门东西。

以下为基础操作:
pair<string,string> p1("ctx","666"); //定义一个pair类型的对象p1并初始化,两个元素的类型都是string,初识默认值为ctx和666 
pair<string,int> p2("ctx",18); //定义一个pair类型的对象p3并初始化,两个元素的类型分别是string和int,初识默认值为ctx和18
pair<string,int> p3(p2); //拷贝p2的值来初始化p3 
pair<string,int> p3=p2; //将p2的值赋值给p3
1
2
3
4
5
typedef简化pair
pair容器的存在在一定程度上方便了我们,但是如果我们需要同时定义多个相同pair类型的对象的时候正常定义的话是不是就显得有些繁琐了呢,所以我们可以使用到typedef关键字来简化定义。

//typedef简化pair的定义
typedef pair<string,string> replace;
 replace c1("ctx","666");
 replace c2("hhxx","ttxs");
 cout<<c1.first<<c1.second<<endl;
 cout<<c2.first<<c2.second<<endl;
————————————————

                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
                        
原文链接:https://blog.csdn.net/H1727548/article/details/130745843

(这段为转载,感兴趣的可以看一下原文,但是跟下面一样,链接废了)

其实没啥好讲的,直接上题:

伊利亚按照以下规则玩纸牌游戏。

一个玩家有几张牌。每张卡片都包含两个非负整数,一个在卡片的顶部,一个在底部。在回合开始时,玩家选择他的一张牌来玩。如果卡片顶部包含数字一个,底部包含数字b,然后当玩家在打牌时,他会得到一个积分,还有机会玩额外的游戏b卡。打完牌后,牌被丢弃。

更正式地说:假设有一个可以玩的牌柜台。在回合开始时,计数器等于 1。当打出一张牌时,打出的牌的计数器减少 1 并增加数字b,写在卡片的底部。然后打出的牌被丢弃。如果在此之后计数器不等于零,则玩家有机会从剩余的牌中打出另一张牌。当计数器达到零或玩家用完牌时,回合结束。

当然,伊利亚希望获得尽可能多的积分。你能确定他能得分的最高分吗?

输入

第一行包含一个整数 n(1 ≤ n ≤ 1000)——Ilya 拥有的卡片数量。

接下来的 n 行中的每一行都包含两个非负空格分隔的整数 —一个b (0 ≤ ≤ 104) — 数字,分别写在第 i 张卡的顶部和底部。

输出

打印单个数字 — 根据所述规则,您在一轮中可以获得的最大分数。

提交途径在这:https://codeforces.com/problemset/problem/155/Bicon-default.png?t=N7T8https://codeforces.com/problemset/problem/155/B

这是答案:

#include <bits/stdc++.h>
using namespace std;
#define fr(i,a,b) for(int i=a;i<b;i++)
int n,b,c=1,ans;
pair<int,int> a[1111];
int main(){
    cin>>n;
    fr(i,0,n)
        cin>>a[i].second>>a[i].first;
    sort(a,a+n);
    reverse(a,a+n);
    while(c>0){
        if(b==n)
            break;
        ans+=a[b].second;
        c+=a[b].first;
        c--;
        b++;
    }
    cout<<ans;
    return 0;
}

还有几题:

小明买咖啡,咖啡是两种口味混一起的,他可以随意配两种。输入第一和第二种口味所有候选可能各自的数量,yummy值与购买所需的钱数。现在他要买最美味的,但是,包装上只呈现出第一种口味,所以他不会买第一种口味的yummy值最低的组合。按照这种买法,他用最多9元买到的组合的yummy值之和最大为多少,要多少钱?

0<数量<100000

-1<yummy值<100

-1<单价<10

样例:

3        数量

1 2 3        yummy值

3 4 4       钱数

2        数量

3 7        yummy值

5 7        钱数

ans:6(3+3),9(4+5)

⭐然后是这两题:

--------------------atcoder_abc201_B--------------------

B - Do you know the second highest mountain? (atcoder.jp)icon-default.png?t=N7T8https://atcoder.jp/contests/abc201/tasks/abc201_b


--------------------L2-042 老板的作息表--------------------

新浪微博上有人发了某老板的作息时间表,表示其每天 4:30 就起床了。但立刻有眼尖的网友问:这时间表不完整啊,早上九点到下午一点干啥了?

本题就请你编写程序,检查任意一张时间表,找出其中没写出来的时间段。

输入格式:
输入第一行给出一个正整数 N,为作息表上列出的时间段的个数。随后 N 行,每行给出一个时间段,格式为:

hh:mm:ss - hh:mm:ss

其中 hh、mm、ss 分别是两位数表示的小时、分钟、秒。第一个时间是开始时间,第二个是结束时间。题目保证所有时间都在一天之内(即从 00:00:00 到 23:59:59);每个区间间隔至少 1 秒;并且任意两个给出的时间区间最多只在一个端点有重合,没有区间重叠的情况。

输出格式:
按照时间顺序列出时间表中没有出现的区间,每个区间占一行,格式与输入相同。题目保证至少存在一个区间需要输出。

输入样例:
8
13:00:00 - 18:00:00
00:00:00 - 01:00:05
08:00:00 - 09:00:00
07:10:59 - 08:00:00
01:00:05 - 04:30:00
06:30:00 - 07:10:58
05:30:00 - 06:30:00
18:00:00 - 19:00:00

输出样例:
04:30:00 - 05:30:00
07:10:58 - 07:10:59
09:00:00 - 13:00:00
19:00:00 - 23:59:59

AC代码:

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int n;
    cin>>n;
    vector<pair<string,string>>pr;
    string s1,s2;
    char c;
    for(int i=0;i<n;i++)
    {
        cin>>s1>>c>>s2;
        pr.push_back({s1,s2});
    }
    pr.push_back({"23:59:59",""});
    pr.push_back({"","00:00:00"});
    sort(pr.begin(),pr.end());
    for(int i=0;i<pr.size()-1;i++)
    {
        if(pr[i].second!=pr[i+1].first)
            cout<<pr[i].second<<" - "<<pr[i+1].first<<endl;
    }
}

                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
                        
原文链接:https://blog.csdn.net/H1727548/article/details/130745843

(不好意思啊,这题转载的,链接好像废了,复制一下应该还能用)

  • 30
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值