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;
}

你可能感兴趣的:(Codeforces,pupil)