A simple problem Problem Description You have a multiple set,and now there are three kinds of operations: 1 x : add number x to set 2 : delete the minimum number (if the set is empty now,then ignore it) 3 : query the maximum number (if the set is empty now,the answer is 0)
The first line contains a number N ( N≤106 ),representing the number of operations. Next N line ,each line contains one or two numbers,describe one operation. The number in this set is not greater than 109 .
For each operation 3,output a line representing the answer.
6 1 2 1 3 3 1 3 1 4 3
3 4
/*******************************************************************/
题意:
3种操作:
①将数x放入集合set
②删除集合set内最小的一个数
③输出集合set内最大的数
解题思路:
这题的想法很简单,熟悉使用STL就简单多了,你可以如题中提到的“multiple set”用multiset来做,也可以用优先队列priority_queue来做,不会的,快去学学STL吧,超好用。当然也可以不使用STL,见方法⑶。
方法⑴ multiset
#include<stdio.h> #include<string.h> #include<stdlib.h> #include<queue> #include<math.h> #include<vector> #include<map> #include<set> #include<cmath> #include<string> #include<algorithm> #include<iostream> #define exp 1e-10 using namespace std; const int N = 25; const int inf = 1000000000; multiset<int> s; multiset<int>::iterator it; int main() { int n,i,k,a; while(~scanf("%d",&n)) { s.clear(); for(i=0;i<n;i++) { scanf("%d",&k); if(k==1) { scanf("%d",&a); s.insert(a); } else if(k==2) { if(s.empty()) continue; it=s.begin(); s.erase(it); } else if(k==3) { if(s.empty()) { printf("0\n"); continue; } it=s.end(); it--; printf("%d\n",*it); } } } return 0; }方法⑵ 优先队列priority_queue
#include<stdio.h> #include<string.h> #include<stdlib.h> #include<queue> #include<math.h> #include<vector> #include<map> #include<set> #include<cmath> #include<string> #include<algorithm> #include<iostream> #define exp 1e-10 using namespace std; const int N = 500005; const int inf = 1000000000; int main() { int n,k,a,Max; while(~scanf("%d",&n)) { Max=-inf; priority_queue<int> q; while(n--) { scanf("%d",&k); if(k==1) { scanf("%d",&a); q.push(a); Max=Max>a?Max:a; } else if(k==2) { if(q.empty()) continue; q.pop(); if(q.empty()) Max=-inf; } else if(k==3) { if(q.empty()) { printf("0\n"); continue; } printf("%d\n",Max); } } } return 0; }
方法⑶ 直接法
记录当前集合里数的个数以及最大数即可
当集合里的数被删光时把最大值改成负无穷,时间复杂度为O(n)。
#include<stdio.h> #include<string.h> #include<stdlib.h> #include<queue> #include<math.h> #include<vector> #include<map> #include<set> #include<cmath> #include<string> #include<algorithm> #include<iostream> #define exp 1e-10 using namespace std; const int N = 500005; const int inf = 1000000000; int main() { int n,k,a,Max,t; while(~scanf("%d",&n)) { Max=-inf;t=0; while(n--) { scanf("%d",&k); if(k==1) { scanf("%d",&a); t++; Max=Max>a?Max:a; } else if(k==2) { if(t) t--; if(!t) Max=-inf; } else if(k==3) { if(!t) { printf("0\n"); continue; } printf("%d\n",Max); } } } return 0; }
菜鸟成长记