2021-10-11 RE处理汇总,以及题目ABC tournament,queue dfs

本文解析了在ABCTournament题目中遇到的数组越界问题,介绍了两种解决方案:一种是通过递归优化避免栈溢出,另一种是使用队列存储并比较数字。同时,讨论了可能导致错误的条件及如何通过数据结构改进以提高代码的健壮性。
摘要由CSDN通过智能技术生成

RE原因

  1. 数组越界;
  2. 除以0;
  3. 非法内存读取;
  4. 系统栈过载,如数组开过大,数组最大 536870911,约5e8;
  5. 递归层次太深,系统栈满,或者无法跳出递归;

题目:ABC Tournament
大意:给定 2N位数,两两比对,选出较大的数字,直到剩下两位数字,输出较小的数字的位置(即输出在原来的 2N位数字中的第几位)

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll a[65550];
queue<int> q;
int main()
{
	int n;
	scanf("%d",&n);
	int k=pow(2,n);
	for(int i=1;i<=k;i++)
	{
		scanf("%lld",&a[i]);
		if(i%2==0)
		{
			if(a[i]>a[i-1]) q.push(i);
			else q.push(i-1);
		}
	}
	if(n!=1)
	{
		while(q.size()>2)
		/*
		没有if(n!=1)时  !=2时RE  >2时WA
		当n==1,!=2时上面输入push进队列的只有一个数字,q.size()=1,无法跳出while循环;
		>2时只有一个数字进入q,后续只有a[x]和a[0]做对比一定输出0,导致WA;
		*/
		{
			int x=q.front();
			q.pop();
			int d=q.front();
			q.pop();
			if(a[x]>a[d])
			{
				q.push(x);
			}
			else q.push(d);
		}
		int x=q.front();
		q.pop();
		int d=q.front();
		if(a[x]>a[d])
		{
			cout<<d<<endl;
		}
		else cout<<x<<endl;
	}
	else
	{
		if(a[1]>a[2]) cout<<2<<endl;
		else cout<<1<<endl;
	}
	return 0;
}

下面:网上的找到题解,思路大概是相同的,但是用的工具不同,且全部数字和下标一起进去q,不会出现上面解法导致的错误。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<long long, int> pli;
int main()
{
	queue<pli> q;
	//用pair不经过第一轮挑选将全部数据和下标一起录进queue
	int n;
	scanf("%d",&n);
	n=1<<n;//学习点1,一直没搞懂这个怎么用
	for(int i=1;i<=n;i++)
	{
		ll x;
		scanf("%lld",&x);
		q.emplace(x,i);
		/*
		emplace构造和插入函数?
		push仅插入函数
		*/
	}
	while(q.size()>2)
	{
		pli x=q.front();
		q.pop();
		pli y=q.front();
		q.pop();
		if(x<y) q.push(y);
		else q.push(x);
	}
	pli x=q.front();
	q.pop();
	pli y=q.front();
	printf("%d\n",x<y?x.second:y.second);
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值