80分悬关注求调!!!
查看原帖
80分悬关注求调!!!
965334
1_1_1_1_1_1_楼主2023/11/29 21:36

6个点超时

#include<bits/stdc++.h>
#define N 100001

using namespace std;

//假设廊桥有无数个
//对于每个区域,每个廊桥所停靠的飞机是固定的 
//将每个区域第几个廊桥能接待飞机数量求出后,
//算出两个区域各分几个廊桥使得接待的飞机数量最多 
//用数组记录每个廊桥接待的飞机数 

struct node//飞机 
{
	int arr;//降落时间 
	int lea;//起飞时间 
};

struct air//廊桥里的飞机 
{
	int lea;//起飞时间 
	int num;//廊桥编号 
};

bool operator < (air n1, air n2)
{
	return n1.lea > n2.lea;
}

int n, m1, m2;

node a[N], b[N];
int x[N], y[N];//记录每个区域每个廊桥接待的飞机数 

bool cmp(node n1, node n2)
{
	return n1.arr < n2.arr;
}

void input()
{
	cin >> n >> m1 >> m2;
	for(int i = 1; i <= m1; i++)
	{
		cin >> a[i].arr >> a[i].lea;
	}
	for(int i = 1; i <= m2; i++)
	{
		cin >> b[i].arr >> b[i].lea;
	}
}

void init()
{
	sort(a + 1, a + m1 + 1, cmp);
	sort(b + 1, b + m2 + 1, cmp);
}

void calcua()
{
	priority_queue<int, vector<int>, greater<int> > qk;//空廊桥编号优先队列,小顶堆 
	priority_queue<air> q;//停飞机的优先队列 
	air u;
	
	int num = 1;//已用廊桥个数 
	int zuixiao = 1000000;//目前第一个空廊桥 
	for(int i = 1; i <= m1; i++)
	{
		//1.这架飞机到达之前的所有飞机起飞
		while(!q.empty() && q.top().lea < a[i].arr)
		{
			u = q.top();
			q.pop();
			qk.push(u.num);
		}
		//2.在空廊桥优先队列中找第一个空廊桥
		if(qk.empty())//廊桥都停了飞机 
		{
			zuixiao = num++;//新建廊桥 
		}
		else
		{
			zuixiao = qk.top();//第一个空廊桥
			qk.pop();
		}
		//到这里已经找出最小廊桥编号
		if(zuixiao > n)//目前廊桥数量已经比规定的多 
		{
			continue;
		} 
		//3.把第i架飞机停进去 
		u.lea = a[i].lea;
		u.num = zuixiao;
		q.push(u);
		//4.记录廊桥接待的飞机数量 
		x[zuixiao]++; 
	}
}

void calcub()
{
	priority_queue<int, vector<int>, greater<int> > qk;//空廊桥优先队列,小顶堆 
	priority_queue<air> q;//停飞机的优先队列 
	air u;
	
	int num = 1;//已用廊桥个数 
	int zuixiao = 1000000;//目前第一个空廊桥 
	for(int i = 1; i <= m2; i++)
	{
		//1.这架飞机到达之前的所有飞机起飞
		while(!q.empty() && q.top().lea < b[i].arr)
		{
			u = q.top();
			q.pop();
			qk.push(u.num);
		}
		//2.在空廊桥优先队列中找第一个空廊桥
		if(qk.empty())//廊桥都停了飞机 
		{
			zuixiao = num++;//新建廊桥 
		}
		else
		{
			zuixiao = qk.top();//第一个空廊桥
			qk.pop();
		}
		//到这里已经找出最小廊桥编号
		if(zuixiao > n)//目前廊桥数量已经比规定的多 
		{
			continue;
		} 
		//3.把第i架飞机停进去 
		u.lea = b[i].lea;
		u.num = zuixiao;
		q.push(u);
		//4.记录廊桥接待的飞机数量 
		y[zuixiao]++; 
	}
}

void testout()
{
	int maxn = -1;
	for(int i = 0; i <= n; i++)//枚举每个区域廊桥个数 
	{
		//i个是国内,n-i个是国外 
		int sum = 0;
		for(int j = 1; j <= i; j++)
		{
			sum += x[j];
		}
		for(int j = 1; j <= n - i; j++)
		{
			sum += y[j];
		}
		maxn = max(maxn, sum);
	}
	cout << maxn;
}

int main()
{
	input();
	init();
	calcua();
	calcub();
	testout();
	return 0;
}
2023/11/29 21:36
加载中...