30分,求指导

P2866 [USACO06NOV] Bad Hair Day S

把出栈入栈那里改成从1到n遍历就AC了,但是我不明白这个从后往前的为什么错了。
by 0315cbw @ 2024-02-19 22:46:54


我悟了,while那里不能加等号,原因是牛会被同身高的遮挡,所以不能将同身高的牛出栈,应当保留,我的代码硬套了P2947的思路,没反应过来,找了一晚上也没发现问题。
by 0315cbw @ 2024-02-19 22:57:24


感觉说的还是不够清楚,举个例子, 100,9,8,7,6,100,带等号的从后往前,100入栈,此后的6,7,8,9都无法撼动100的地位,无法令其出栈,然而到第一位的100时,其将第六位的100移除,栈空,算法错误地认为第一位的100大于第六位的100,将b[i]赋为0,在计算ans时直接6-1=5了,然而应当是4;为什么从前往后不会出问题呢?因为它在将元素踢出栈的时候给予标记,表示将其踢出的凶手标号,对于第六个100,成功将第一个100踢出,表示自己阻碍的第一个100的视线,符合题意。
by 0315cbw @ 2024-02-19 23:12:40


为什么同样是带等号,从前往后符合题意,从后往前就不符合了?因为从前往后的思想是,从1到n,依次往右看,栈顶元素发现比自己高(或者等于)的a[i],阻挡了自己的视线,就记录下来,然后自己出栈,一直出栈到栈顶元素比a[i]大为止,然后将a[i]入栈,一直没出过栈的就是一直没被遮挡的,它们标记为0;但从后往前的思想是,拿着栈顶元素,发现比自己矮的,就给他标记,表示自己阻挡了对方的视线,要是对方比自己高,就退位让贤,让这个更高的入栈,碰到和自己相等的情况,他错误地认为对方比自己强,自己出栈,让对方入栈了,却没有给予自己的标记,而是给予了栈中下一个元素的标记(栈空则为0),然而事实是对方的视线同样被栈顶元素所阻挡(因为是从左往右看,右边的元素天然具有优势,在同身高对抗中获胜),应当给予栈顶元素的标记,错误在于忽略了本题对遮挡的具体要求。
by 0315cbw @ 2024-02-19 23:37:39


我发的纯属给后面的做题者的警示,没有题解的想法,请不要删除我的帖子( ̄3 ̄)a
by 0315cbw @ 2024-02-19 23:42:00


|