1. 程式人生 > >UVA11136 【Hoax or what】我的標題哪裡空了

UVA11136 【Hoax or what】我的標題哪裡空了

優先佇列ADT
UVA11136 【Hoax or what】
題意:沃爾瑪超市有n天做活動,每天有k筆交易。每次交易都將含有交易額的小票放在一個箱子中抽獎。每天從箱子中抽取最大和最小交易額的小票,並支出它們兩個差的金額的錢給最大交易額的顧客。求n天沃爾瑪超市總共支出。

做法有二:兩個優先佇列;multset。

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<queue>
 5 using namespace std;
 6 int num[10000000
]; 7 int main() 8 { 9 int n,m,a; 10 long long ans; 11 while(scanf("%d",&n)==1&&n) 12 { 13 priority_queue<int> da; 14 priority_queue<int,vector<int>,greater<int> >xiao; 15 memset(num,0,sizeof(num)); 16 ans=0; 17 while
(n--) 18 { 19 scanf("%d",&m); 20 for(int i=1;i<=m;++i) 21 { 22 scanf("%d",&a); 23 da.push(a); 24 xiao.push(a); 25 num[a]++; 26 } 27 while(!num[da.top()]) da.pop();
28 while(!num[xiao.top()]) xiao.pop(); 29 int zuida=da.top();da.pop();num[zuida]--; 30 int zuixiao=xiao.top();xiao.pop();num[zuixiao]--; 31 ans+=zuida-zuixiao; 32 } 33 printf("%lld\n",ans); 34 } 35 return 0; 36 }

 

 

 1 #include <cstdio>
 2 #include <set>
 3  
 4 using namespace std;
 5  
 6 typedef long long ll;
 7  
 8 multiset<int> s;
 9 multiset<int>::iterator first, last;
10  
11 int main () {
12  
13     int n, k, num;
14     ll ans;
15     while (scanf ("%d", &n) && n) {
16  
17         ans = 0;
18         s.clear();
19         while (n--) {
20             
21             scanf ("%d", &k);
22             for (int i = 0; i < k; i++) {
23                 scanf ("%d", &num);
24                 s.insert (num);
25             }
26             first = s.begin();
27             last = s.end();
28             last--;
29             
30             ans += *last - *first; 
31             s.erase(first);
32             s.erase(last);
33         }
34         printf ("%lld\n", ans);
35     }
36     return 0;
37 }