【ACM】 multiset 的 一些应用

一、The kth great number

题目链接:https://vjudge.net/problem/HDU-4006

用set写超时 (在VJ里,用C++显示Compilation Error,选择G++,则是TLE)

#include 
#include 
#include 
#include 
#include 
#include 
typedef long long ll;
using namespace std;

int main ()
{
	string com;
	int n,x,k;
	while(scanf("%d",&n)!=EOF)
	{
		multiset> s;
		multiset>::iterator it;
		cin >> k;
		while(n--)
		{
			cin >> com;
			if(com=="I")
			{
				cin >> x;
				s.insert(x);
			}
			else if(com == "Q")
			{
				int count=0;
				for(it=s.begin();it!=s.end();it++)
				{
					count++;
					if(count==k)
					{
						cout << *it <

之后再想一想的时候,发现set里面不允许有重复的字符,但是这个题目是可以存在重复的情况的,所以改用multiset,之后保证multiset里一直都只有k个数字(默认按照从小到大排列),所以保证了第一个数组是他的第k大数字。

#include 
#include 
#include 
#include 
#include 
#include 
typedef long long ll;
using namespace std;

int main ()
{
	string com;
	int n,x,k;
	while(scanf("%d",&n)!=EOF)
	{
		multiset s;
		multiset::iterator it;
		cin >> k;
		while(n--)
		{
			cin >> com;
			if(com=="I")
			{
				cin >> x;
				s.insert(x);
				if(s.size()>k)
					s.erase(s.begin());
			}
			else if(com == "Q")
			{
				cout << *s.begin() << endl;
			}
		}
	}
	return 0;
}

 

 

二、排序

http://acm.hdu.edu.cn/showproblem.php?pid=1106

string + multiset

个人感觉用字符数组处理会很麻烦

一开始用的是set就会WA,因为set里没有重复的数字,但是这道题目里是允许有重复的数字的

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
typedef long long ll;
using namespace std;

int main ()
{
	string s,s1;
	multiset t;
	s1.clear();
	s.clear();
	while(cin >> s)
	{
		int i=0;
		while(i> a;
					t.insert(a);
					s1.clear();
				}
			}
			i++;
		}
		if(s1.empty()!=1)
		{
			ll a;
			stringstream ss;
			ss << s1;
			ss >> a;
			t.insert(a);
			s1.clear();
		}
		multiset::iterator it;
		for(it=t.begin();it!=t.end();it++)
		{
			if(it!=t.begin())	cout << " ";
			cout << *it ;
		}
		cout << endl;
		s.clear();
		s1.clear();
		t.clear();
	}
	return 0;
}

 

你可能感兴趣的:(ACM)