PAT (Advanced Level) 1029 Median

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/w419387229/article/details/81776335

自己的代码:用一个队列存第一行数字,第二行输入的时候就直接和队头的比较,每比较一次cnt+1。这种写法有点麻烦,因为情况有点多,如:队列是不是空;如果队头删了是不是空等等都要有相应的操作,所以代码有点冗长。

还有个问题,一开始queue里存了long long,内存就超了,这个以后得注意下。

#include<iostream>
#include<cstdlib>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#include<climits>
using namespace std;
typedef long long ll;
int n, sum = 0, cnt = 0;
ll tmp;
queue<int> q;
int main(){
	scanf("%d",&n);
	sum += n;
	for(int i = 0; i < n; ++i){
		scanf("%lld",&tmp);
		q.push(min((ll)INT_MAX,tmp));
	}
	scanf("%d",&n);
	sum += n;
	int median = 0;
	if(sum % 2 == 0)
		median = sum / 2;
	else
		median = sum / 2 + 1;
	ll pre;
	int flag = 0;
	for(int i = 0; i < n; ++i){
		scanf("%lld",&tmp);
		tmp = min((ll)INT_MAX,tmp);
		if(!q.empty()){
			while(!q.empty()){
				pre = q.front();
				if(pre >= tmp){
					++cnt;
					pre = tmp;
					if(median == cnt){
						flag = 1;
						break;
					}
					break;
				}
				else{
					q.pop();
					++cnt;
					if(median == cnt){
						flag = 1;
						break;
					}
					if(q.empty()){
						pre = tmp;  
						++cnt;
					}
					if(median == cnt){
						flag = 1;
						break;
					}
					
				}
				
			}
			if(flag == 1) break;
		}
		else{
			pre = tmp;
			++cnt;
			if(median == cnt){
				break;
			}
		}
	}
	for(; cnt < median; ++cnt){
		pre = q.front();
		q.pop();
	}
	printf("%lld",pre);
	return 0;
}

网上看到的比较简单一点的写法,用两个队列,每次只比较两个队头,这就相当于每个样例同时在内存中的数永远都只有第一个数列长度的量,也能解决超内存的问题。只要注意每个队列最后都插入一个int的最大值,防止空队列的时候产生意外。

原博地址 

#include<iostream>
#include<cstdlib>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#include<climits>
using namespace std;
typedef long long ll;
int n, sum = 0, cnt = 0;
ll tmp;
queue<int> q1,q2;
int main(){
	scanf("%d",&n);
	sum += n;
	for(int i = 0; i < n; ++i){
		scanf("%lld",&tmp);
		q1.push(min((ll)INT_MAX,tmp));
	}
	q1.push(INT_MAX);
	scanf("%d",&n);
	sum += n;
	for(int i = 0; i < n; ++i){
		scanf("%lld",&tmp);
		q2.push(min((ll)INT_MAX,tmp));
		if(cnt == (sum - 1) / 2){
			printf("%d",min(q1.front(),q2.front()));
			return 0;
		}
		if(q1.front() < q2.front()) q1.pop();
		else q2.pop();
		++cnt;
	}
	q2.push(INT_MAX);
	for(; cnt < (sum - 1) / 2; ++cnt){
		if(q1.front() < q2.front()) q1.pop();
		else q2.pop();
	}
	printf("%d",min(q1.front(),q2.front()));
	return 0;
}

猜你喜欢

转载自blog.csdn.net/w419387229/article/details/81776335
今日推荐