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