Shurikens CodeForces - 1413D

原题链接
考察:贪心+栈
本蒟蒻的思路:
  检查"NO":计算每次-操作的价格最大值与最小值,如果不在此范围输出NO.
  当时想出的赋值方式是while存储所有可能取值,这时间复杂度最坏O(n2).而且这种思路也比较麻烦,计算最大值与最小值也需要while处理.

参考大佬的思路:
  检查NO不是通过范围取值,而是检查是否存在大的价格在进货的时候晚,出货又比小价格早的情况.
  我们假定一种好算的情况,即卖出的一定是最近进货的.那么卖出的x在答案数组的位置就确定了.我们在计算答案数组的途中,如果答案数组存在位置比它大但价格也比它大的数,说明情况违法.

Code

#include <iostream>
#include <cstring>
using namespace std;
const int N = 100010;
int n,ans[N],ch[N],tt;
char op[3];
bool solve()
{
	int cnt = n,x,nums= 0;
	for(int i=1;i<=2*n;i++)
	{
		scanf("%s",op);
		if(op[0]=='+') ch[++tt] = ++nums;
		else{
			scanf("%d",&x);//检查 ans已赋值的数是否价格合法.
			if(tt<=0||ans[ch[tt]+1]>x) return 0;
			ans[ch[tt--]] =x; //ans已经赋值说明出货早.
		}
	}
	return 1;
}
int main()
{
	scanf("%d",&n);
	if(solve())
	{
		puts("YES");
		for(int i=1;i<=n;i++) printf("%d ",ans[i]);
		printf("\n");
	}else puts("NO");
	return 0;
}
posted @ 2021-05-25 15:05  acmloser  阅读(54)  评论(0编辑  收藏  举报