您的位置:首页 > 其它

UVA11136Hoax or what( multiset的应用)

2016-03-05 11:57 253 查看
题目链接

题意:n天,每天往一个箱子里放m个数,放完之后取最大的Max和最小的min做差,并把这两个数去掉,求n天之后的和

multiset 和 set的原理是相似的,multiset可以存多个相同的数,而set都是唯一的,同时都是从小到大排列

set容器的总结

set还有lower_bound(x) {返回 第一个大于或者等于x的位置} 和 upper_bound(x) { 返回第一个大于x的位置 }

#include <iostream>
#include <set>
#include <algorithm>
#include <cstring>
#include <cstdio>
using namespace std;
multiset<int> s;
int main()
{
int n,m;
while(scanf("%d", &n) != EOF && n)
{
s.clear();
long long ans = 0;
int minn,maxn;
for(int i = 1; i <= n; i++)
{
scanf("%d", &m);
for(int j = 1; j <= m; j++)
{
int thing;
scanf("%d", &thing);
s.insert(thing);
}
if(s.size() > 0)
{
multiset<int>::iterator it;
it = s.end();
it--;
maxn = *it;
s.erase(it);  // 本来这里写成了s.erase(maxn),错误,应为会把所有的maxn都删除,这里只要删除一个
it = s.begin();
minn = *it;  //如果最后只剩下一个数,既是最大又是最小
if(s.size() > 0)
{
it = s.begin();
s.erase(it);
}
ans += maxn - minn;
}
}
printf("%lld\n", ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: