CF1492B Card Deck 题解

Content

\(n\) 张纸牌组成的一个牌堆,每张纸牌都有一个价值 \(p_1,p_2,\dots,p_n\)。每次选出最顶上的几个牌放到另外一个一开始为空的牌堆里面。定义一个牌堆的总值为 \(\sum\limits_{i=1}^nn^{n-i} \cdot p_i\)。请构造出一个可能的最终的牌堆,使得这个牌堆的总值最大。

数据范围:\(t\) 组数据,\(t\in[1,10^3]\)\(1\leqslant p_i\leqslant n\leqslant 10^5\)

Solution

我们不难想到,需要尽可能将 \(p_i\) 大的牌放到前面去,因此我们想到这样一个贪心算法:将前 \(1\sim n\) 个数的最大值所在位置记为 \(maxi_i\)\(maxi_i\) 可以通过边读入边记录,详见代码),然后从牌顶开始,每次将 \(maxi_i\) 相等的牌按照原来的顺序放入新的牌堆,这样可以保证将 \(p_i\) 大的牌放在前面而又符合要求。

Code

int n, p[100007], maxi[100007], ans[100007], cnt;

int main() {
 	MT {
		memset(ans, 0, sizeof(ans));
		memset(maxi, 0, sizeof(maxi));
		n = Rint, cnt = 0;
		F(i, 1, n) {
			p[i] = Rint;
			if(p[i] > p[maxi[i - 1]]) maxi[i] = i, ans[++cnt] = i;
			else maxi[i] = maxi[i - 1];
		}
		ans[++cnt] = n + 1;
		R(i, cnt, 1) F(j, ans[i], ans[i + 1] - 1) printf("%d ", p[j]);
		puts("");
	}
	return 0;
}
posted @ 2021-12-16 14:22  Eason_AC  阅读(41)  评论(0)    收藏  举报