题解 AT1444 【数を3つ選ぶマン】

求过

STL大法好!

本题是set好题,将三个数加起来存到set中,既可以去掉重复的,还能从小到大排序!

但是有个大问题!如何输出那个第三大的?set是不能用下标访问的!我们的确可以用end返回的迭代器三次自减然后输出,类似第一篇题解。不过我这里给大家介绍另一种迭代器类型,那就是:reverse_iterator

这种迭代器是支持逆序遍历,从rbegin的位置,也就是最后一个数据的迭代器,到rend,也就是第一个数据 - 1的迭代器,rbeginrend是两个函数,其返回值不能跟iterator混用,必须用reverse_iterator

这里说一个小误区,end的返回值其实是最后那个数据 + 1的迭代器,而rbegin是最后一个数据的迭代器。

还有就是尽管是reverse_iterator,遍历还是用自增而非自减。

所以代码:

#include <cstdio>
#include <set>
using namespace std;

int a[10];

set<int> sum;

int main()
{
    scanf("%d %d %d %d %d", &a[1], &a[2], &a[3], &a[4], &a[5]);
    for(register int i = 1; i <= 5; i++)
    {
        for(register int j = i + 1; j <= 5; j++)
        {
            for(register int k = j + 1; k <= 5; k++)
            {
                sum.insert(a[i] + a[j] + a[k]);
            }
        }
    }
    int i = 0;
    set<int>::reverse_iterator endd = sum.rbegin(), beginn = sum.rend();
    for(set<int>::reverse_iterator it = endd; it != beginn; ++it) // 迭代器的自增最好名字放前面,并且不要在for循环条件中放函数
    {
        i++;
        if(i == 3) {printf("%d\n", *it); return 0;}
    }
    return 0;
}
posted @   HappyBobb  阅读(4)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示