Problem B. 魔法师排队
时间限制 2000 ms
内存限制 64 MB
题目描述
有n个魔法师在排队买魔法面包,每个魔法师都有自己的魔力值,用一个正整数表示。 魔法师都不喜欢排队,如果任意时刻某个魔法师发现前面的魔法师的魔力值比自己小,那么这个魔法师就会用法术把前面的人传送到异空间。 请输出有多少个魔法师会被传送到异空间。
输入数据
第一行为一个正整数n,代表魔法师的人数。 接下来一行位n个正整数,第i个正整数ai代表队伍中第i个魔法师的魔力值。(第1个魔法师在队头,第n个魔法师在队尾)
1 <= n <= 1000000
1 <= ai <= 100000000
输出数据
被传送到异空间的魔法师个数
样例输入
1 | 5 |
样例输出
1 | 2 |
题解
一开始的想法是:找从第一个魔法师到最后一个魔法师中的拥有最大魔力值的魔法师max_index
,那么位于它之前的魔法师都将会被传送走,此具有最大魔力值的魔法师会留下来;接着寻找从max_index + 1
到最后一个魔法师之间的拥有最大魔力值的魔法师,进行同样的操作,依次循环下去,直到剩下最后一个魔法师为止(最后一个魔法师肯定会留下来);然而结果却超时了。于是换了种思维方式,既然是位于魔法师前面且比其魔力值小的魔法师会被传送走,那么最后一个魔法师肯定会留下来;直接定义一个存储最大魔力值的变量max_num
,初始化为最后一个魔法师的魔力值,从后向前倒序遍历,如果当前魔法师的魔力值比max_num
小,那么就把他传送走;否则,更新最大魔力值。
TLE代码
1 | #include <iostream> |
AC代码
1 | #include <iostream> |