题目描述
超市有n天的促销活动
每天有k张小票写着购物金额放入箱子中
这一天结束后就取出其中的最大值max和最小值min接着超市会放出max-min金额的奖品
问超市放出奖品金额的总价值是多少
样例
5 3 1 2 3 2 1 1 4 10 5 5 1 0 1 2 2 2 1 2 2 1 2 0
19 2
算法1
(multiset)
- 动态维护最大值和最小值我们可以用set和multiset
- 如果有多个相同的元素那么就必须使用multiset
时间复杂度
参考文献
C++ 代码
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> // #include <unordered_map> #include <vector> #include <queue> #include <set> #include <bitset> #include <cmath> #include <map> #define x first #define y second #define P 131 #define lc u << 1 #define rc u << 1 | 1 using namespace std; typedef long long LL; int n; inline void solve() { while(scanf("%d",&n) == 1) { if(n == 0) break; multiset<int> S; LL res = 0; for(int i = 0;i < n;i ++) { int k; scanf("%d",&k); for(int j = 0;j < k;j ++) { int x; scanf("%d",&x); S.insert(x); } set<int>::iterator fir,las; fir = S.begin(); las = S.end(); las --; res += *las - *fir; S.erase(las); S.erase(fir); } printf("%lld\n",res); } } int main() { int _ = 1; // freopen("network.in","r",stdin); // freopen("network.out","w",stdout); // init(N - 1); // scanf("%d",&_); while(_ --) { // scanf("%lld%lld",&n,&m); solve(); // test(); } return 0; }
算法2
(deque + 排序)
- 我们可以用deque维护小票的集合
- 每次加入完新的小票后排序,取队首和队尾元素
时间复杂度
参考题解:(12条消息) UVA11136 Hoax or what【multiset+deque】_海岛Blog-CSDN博客
C++ 代码
看文献