题解 AT1444 【数を3つ選ぶマン】
求过。
STL大法好!
本题是set
好题,将三个数加起来存到set
中,既可以去掉重复的,还能从小到大排序!
但是有个大问题!如何输出那个第三大的?set
是不能用下标访问的!我们的确可以用end
返回的迭代器三次自减然后输出,类似第一篇题解。不过我这里给大家介绍另一种迭代器类型,那就是:reverse_iterator
。
这种迭代器是支持逆序遍历,从rbegin
的位置,也就是最后一个数据的迭代器,到rend,也就是第一个数据 - 1的迭代器,rbegin
和rend
是两个函数,其返回值不能跟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;
}
分类:
题解
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现