複賽模擬試題 河床

2021-07-23 04:51:07 字數 1503 閱讀 2445

【問題描述】

地理學家們經常要對一段河流進行測量分析。他們從上游開始向下游方向等距離地選擇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 甲...