最后一个点T了,求调
查看原帖
最后一个点T了,求调
1379306
Furinaaaa楼主2024/7/4 17:39
#define _CRT_SECURE_NO_WARNINGS

using namespace std;

#include <iostream>
#include <cstring>
#include <vector>
#include <queue>
#include <limits.h>

//比较大小
int mymax(int a, int b)
{
	if (a > b)
	{
		return a;
	}
	return b;

}
int mymin(int a, int b)
{
	if (a > b)
	{
		return b;
	}
	return a;

}

int main()
{
	//递增队列,队首最小
	priority_queue <int, vector<int>, greater<int> >  q1[100666];

	//递减数列,队首最大
	priority_queue <int, vector<int>, less<int> >  q2[100666];

	//记录队列数量
	int lines = 1;

	//记录队列数量
	int l2 = 1;

	int a;

	//freopen( "P1020_1.in" , "r" , stdin ) ; 

	//输入数据
	while (1)
	{
		if (scanf("%d", &a) == EOF)
		{
			break;
		}
		//如果为空,直接添加
		if (q1[lines].empty())
		{
			q1[lines].push(a);
			
		}
		//如果为空,直接添加
		if (q2[l2].empty())
		{
			q2[l2].push(a);
			continue;
		}

		//比较大小
		int small = 1;
		int hsmall = INT_MAX;
		//遍历所有队列,希望找出一个最小的队首,使其大于a
		for (int i = 1; i <= lines; i++)
		{
			int head = q1[i].top();
			if (a <= head)
			{
				if (head < hsmall)
				{
					small = i;
					hsmall = head;
				}
			}
		}
		//没有被修改
		if (hsmall == INT_MAX)
		{
			//新开一列
			lines += 1;
			q1[lines].push(a);
			
		}
		else
		{
			//向最小的大于a的那队,添加a
			q1[small].push(a);
			
		}



	

		//比较大小
		int big = 1;
		int hbig = INT_MIN;
		//希望上升队列数尽可能地少
		// 每次添加a时,如果所有的队首都>=,只能新开一列,没办法
		// 如果有比a更小的队首,因为希望之后的数更有可能直接添加入队列,所以期盼
		// 添加a后,所有队首尽可能地小。
		//于是遍历所有队列,希望找出一个最大的队首,使其<a
		for (int i = 1; i <= l2; i++)
		{
			int head = q2[i].top();
			if (head < a)
			{
				//尝试更新
				if (head > hbig)
				{
					big = i;
					hbig = head;
				}
			}
		}
		//没有被修改
		if (hbig == INT_MIN)
		{
			//新开一列
			l2 += 1;
			q2[l2].push(a);
		
		}
		else
		{
			//向最大的小于a的那队,添加a
			q2[big].push(a);
			
		}
	}
	

	//给出答案
	cout << l2 << endl;
	cout << lines;

	return 0;



}
2024/7/4 17:39
加载中...