【問題描述】
地理學家們經常要對一段河流進行測量分析。他們從上游開始向下游方向等距離地選擇n(n<=30000)個點測量水位深度。得到一組資料a1,a2,…,an,回到實驗室後資料分析員根據需要對資料進行分析,發掘隱藏在資料背後的規律。
最近,烏龍博士發現某種水文現象與河床地勢有關,於是他指示分析員要找出一段河流中最大高低起伏差不超過k(1<=k<=100)的最長的一段。這看似乙個簡單的問題,由於任務緊急,分析員來求助於你,並告訴你博士的所有資料都精確到個位。
【輸入格式】
第一行包含兩個整數n和k,分別表示測量點的個數和博士要求的最大水深度(也就是河床的地勢差)。
第二行包含n個整數,表示從上游開始依次得到的水位深度di(1<=i<=n,0<=di<=32767)
【輸出格式】
乙個整數m,表示最長一段起伏不超過k的河流長度,用測量點的個數表示
【輸入樣例】
6 2
5 3 2 2 4 5
【輸出樣例】
【資料範圍】
30%的資料,滿足:1<=n<=5000;
50%的資料,滿足:1<=n<=30000,符合條件的最長連續序列長度不超過100;
100%的資料,滿足:1<=n<=30000,符合條件的最長連續序列長度不超過n;
【**】
從第2個測量點到第5個測量點之間的一段,即3 2 2 4,起伏最大為2
這道題我用的滑動視窗(用優先佇列優化),動態維護最大值和最小值。這樣就可以很快的列舉出ans了。
**如下:
#include
#include
#include
#include
#include
#include
using
namespace
std;
const
int maxn=30005;
const
int inf=100000000;
int n,k,a[maxn],d[3][maxn]=,ans=0;
struct shu
};priority_queueq;
priority_queueq1;
int read()
return x;
}void init()
int main()
); q1.push((shu1));
ans=1;
for(int i=2;i<=n;i++)
);q1.push((shu1));
shu t=q.top();
shu1 tt=q1.top();
while(t.h-tt.h>k)
if(t.id>tt.id)
t=q.top();
tt=q1.top();
}ans=max(ans,i-s+1);
}printf("%d",ans);
return
0;}
複賽模擬試題 求和
問題描述 計算 1 b 2 b a b 的和除以 10000 的餘數 輸入格式 第一行乙個整數n,表示有n組測試資料 接下來n行,每行包含兩個正整數a和b。輸出格式 n行,對應輸入的答案 輸入樣例 1 2 3 輸出樣例 資料範圍 30 的資料滿足 1 n 10,a,b 1000 100 的資料滿足 ...
複賽模擬試題 計數排序
問題描述 fj所在的城市正在進行人口普查,fj想知道自己所在城市人口的年齡分布狀況,準備將年齡從小到大排序,可是資料實在太多,fj忙了幾天也沒有排出來,你能幫助他嗎?輸入格式 第一行 n,表示城市的人口總數。第二行 n個整數,表示每人的年齡。輸出格式 只有一行,每個資料之間空一格,輸出排序後每個人的...
複賽模擬試題 物品選取
問題描述 小沐同學確信所有問題都有個多項式時間演算法,為了證明,他決定自己去當一次旅行商,在上路之前,小 x 需要挑選一些在路上使用的物品,但他只有乙個 能裝體積為 m 的揹包。顯然,揹包問題對小沐來說過於簡單了,所以他希望你來幫他解決這個問題。小沐可以選擇的物品有 n樣,一共分為甲乙丙三類 1 甲...