Envy
時間限制: 1 Sec 內存限制: 128 MB
提交: 312 解決: 63
[提交][狀態][討論版]
題目描述
今年的 ACM 比賽推出了一個賽後的娛樂活動,所有參賽選手排成一排玩擊鼓傳花,關於擊鼓傳花的玩法是這樣的:
數人或幾十人圍成圓圈坐下,其中一人拿花(或一小物件);另有一人揹着大家或矇眼擊鼓(桌子、黑板或其他能發出聲音的物體),鼓響時衆人開始依次傳花,至鼓停止爲止。此時花在誰手中(或其座位前),誰就上臺表演節目(多是唱歌、跳舞、說笑話;或回答問題、猜謎、按紙條規定行事等);偶然如果花在兩人手中,則兩人可通過猜拳或其它方式決定負者。
擊鼓傳花是一種老少皆宜的遊戲。 當然,就和大多數的 ACM 題面的套路一樣,我們上面也說了一段廢話,下面我們來說一下正題......
我們讓 N 個人站成一排,編號爲 1~N,每個人都有一個數字代表他這次比賽的成績,對於每個人,如果他後面(編號大於他的人中)存在一個人的成績大於等於他,那麼他的嫉妒值爲他們之間的距離。兩個點 a和 b 之間的距離爲 abs(a - b)。例如:{4,3,6,2},那麼第 1 個人對第 3 個人有 2 點嫉妒值;第 2 個人對第 3 個人有 1 點嫉妒值,最大嫉妒值爲 2。
輸入
第 1 行:1 個整數 N,代表這裏有 N 個人(2 <= N <= 50000)。
接下來的 N 行:每行一個數 Ai(1 <= Ai <= 10^9), 表示第 i 個人的比賽成績。
輸出
輸出最大嫉妒值。
樣例輸入
4
4
3
6
2
樣例輸出
2
提示
來源
簡直是和here一模一樣
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1e5 + 5;
int a[MAXN];
int b[MAXN];
int main()
{
int n;
int i, j;
int ans;
while (~scanf("%d", &n)) {
scanf("%d", &a[0]);
b[0] = a[0];
for (i = 1; i < n; ++i) {
scanf("%d", &a[i]);
b[i] = min(b[i - 1], a[i]);
}
ans = 0;
j = n - 1;
for (i = n - 1; i >= 0; --i) {
while (b[i] > a[j]) {
--j;
}
if (a[i] <= a[j]) {
ans = max(ans, j - i);
}
}
printf("%d\n", ans);
}
return 0;
}