MZL's simple problem
Time Limit: 3000/1500 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 0 Accepted Submission(s): 0
Problem Description
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)
Input
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.
Output
For each operation 3,output a line representing the answer.
Sample Input
6 1 2 1 3 3 1 3 1 4 3
Sample Output
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;
}
菜鸟成长记