时间限制:3.000秒
每天往箱子里放一定数量的小票,这一天结束后从箱子里取出金额最大和最小的两张小票,然后金额最大的小票对应的顾客将会获得价值两者金额之差的礼品,问n天之后一共发出去多少价值的礼品。
因为要排序而且要两头取,所以这里用到了STL里面的可重集multiset。做出来2.412秒,看有的大神只花了0.362秒,真心不知道怎么做的……
#include
#include
using std::multiset;
multiset
box;
int main() {
int n, k;
long long m, sum;
while(~scanf("%d", &n) && n) {
box.clear(); sum = 0;
for(int i = 0; i != n; ++i) {
scanf("%d", &k);
for(int i = 0; i != k; ++i) {
scanf("%lld", &m);
box.insert(m);
}
auto s = box.begin(), e = box.end(); --e;
sum += *e - *s;
box.erase(e); box.erase(box.begin());
}
printf("%lld\n", sum);
}
}

本文详细介绍了如何使用STL中的multiset数据结构解决UVA在线评测题,涉及输入处理、数据存储、排序及计算过程。通过循环遍历输入数据,利用multiset进行货币金额的存储与排序,最终计算并输出n天内货币分配的总价值差额。

345

被折叠的 条评论
为什么被折叠?



