C. Nauuo and Cards(思维题)

题目并不难,思维题一定要把逻辑理清,否则不知道要debug多久。

int a[N], b[N];
int main()
{
	int n;
	while (cin >> n)
	{
		f(i, 1, n)scanf("%d", &a[i]);
		f(i, 1, n)scanf("%d", &b[i]);
		int pos = 1;
		while (b[pos] != 1&&pos<=n)pos++;
		if (pos == n + 1)goto p2;
		else goto p1;
		while (0)//1在b
		{//先检查1的后续是否需要跟新
		p1:int depth = pos;
			int fg = 0,fg3=1;
			f(i, pos + 1, n)
			{
				if (b[i] - 1 != i - pos)fg3 = 0;
				if (b[i]!=0)
				{
					if (b[i] - 1 < i - pos)depth =max( pos + (i - pos) - (b[i] - 1),depth);//有不符合必>n
				}
				else fg = 1;//有0必>n
			}
			if (depth > pos||fg)
				cout << n + depth << endl;
			else//是否可小于n(在需某个值时,它已经出队)
			{
				int now = b[n];//6
				int fg2 = 0;
				f(i, 1, pos - 1)
				{
					if (b[i] == 0)continue;
					int gp = b[i] - now;//等待时间  7 8 1 2 3 4 5 6
					if (i>=gp)fg2 = 1;//n+pos
				}
				if (fg2||!fg3)cout << n + pos << endl;
				else cout << pos-1 << endl;
			}
		}
		while (0)//1在 a
		{
		p2:
			int gp = 0;
			f(i, 1, n)
			{
				if (b[i] == 0)continue;
				if (b[i] - 1 <i)gp = max(gp, i - b[i] + 1);//4 3 0 0 0(gp=0)
			}
			cout << gp + n << endl;
		}
	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值