题解 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;
}

浙公网安备 33010602011771号