51nod 1521 一維戰艦

2021-07-25 20:25:13 字數 1486 閱讀 6866

1521 一維戰艦

codeforces

基準時間限制:1 秒 空間限制:131072 kb 分值: 10 

難度:2級演算法題

愛麗絲和鮑博喜歡玩一維戰艦的遊戲。他們在一行有n個方格的紙上玩這個遊戲(也就是1×n的**)。

在遊戲開始的時候,愛麗絲放k個戰艦在這個**中,並不把具體位置告訴鮑博。每乙隻戰艦的形狀是 1×a 的長方形(也就是說,戰艦會佔據a個連續的方格)。這些戰艦不能相互重疊,也不能相接觸。

然後鮑博會做一系列的點名。當他點到某個格仔的時候,愛麗絲會告訴他那個格仔是否被某只戰艦佔據。如果是,就說hit,否則就說miss。

但是這兒有乙個問題!愛麗絲喜歡撒謊。他每次都會告訴鮑博miss。

請你幫助鮑博證明愛麗絲撒謊了,請找出哪一步之後愛麗絲肯定撒謊了。

input

單組測試資料。

第一行有三個整數n,k和a(1≤n,k,a≤2*10^5),表示**的大小,戰艦的數目,還有戰艦的大小。輸入的n,k,a保證是能夠在1×n的**中放入k只大小為a的戰艦,並且他們之間不重疊也不接觸。

第二行是乙個整數m(1≤m≤n),表示鮑博的點名次數。

第三行有m個不同的整數x1,x2,...,xm,xi是鮑博第i次點名的格仔編號。格仔從左到右按照1到n編號。

output

輸出乙個整數,表示最早一次能夠證明愛麗絲一定撒謊的點名編號。如果不能證明,輸出-1。點名的編號依次從1到m編號。
input示例

樣例1

11 3 3

54 8 6 1 11

樣例25 1 3

21 5

output示例

樣例輸出1

3樣例輸出2

-1

題解:這一題主要是做減法。 對於剛開始n個格仔,我們知道最多可以放 max = (n+1)/(a+1) 個戰艦。下面每填進乙個

temp位置不能放戰艦,我們就需要計算填進來的這個位置造成了多少個可填放的戰艦數的減少。 也就是 

num = (right-left)/(a+1) - (right-temp)/(a+1) - (temp-left)/(a+1) 。(left,right表示填數分割出來的區間)當前能放的戰

艦最大數就是 max =  max - num。 

當max

在這個題目的實現上面有很多方式,set+二分,陣列+二分,直接用陣列找邊界。 重要的還是理解上面的做減法的思想。

**如下:

#include #include #include #include using namespace std;

const int maxn = 2e5+10;

bool flag[maxn];

sets;

int main()

} if(max>=k)

printf("-1\n");

} return 0;

}

51nod 1521 一維戰艦

1521 一維戰艦 codeforces 基準時間限制 1 秒 空間限制 131072 kb 分值 10 難度 2級演算法題 愛麗絲和鮑博喜歡玩一維戰艦的遊戲。他們在一行有n個方格的紙上玩這個遊戲 也就是1 n的 在遊戲開始的時候,愛麗絲放k個戰艦在這個 中,並不把具體位置告訴鮑博。每乙隻戰艦的形狀...

51nod 1521 一維戰艦

愛麗絲和鮑博喜歡玩一維戰艦的遊戲。他們在一行有n個方格的紙上玩這個遊戲 也就是1 n的 在遊戲開始的時候,愛麗絲放k個戰艦在這個 中,並不把具體位置告訴鮑博。每乙隻戰艦的形狀是 1 a 的長方形 也就是說,戰艦會佔據a個連續的方格 這些戰艦不能相互重疊,也不能相接觸。然後鮑博會做一系列的點名。當他點...

51Nod 1521 一維戰艦

在遊戲開始的時候,愛麗絲放k個戰艦在這個 中,並不把具體位置告訴鮑博。每乙隻戰艦的形狀是 1 a 的長方形 也就是說,戰艦會佔據a個連續的方格 這些戰艦不能相互重疊,也不能相接觸。然後鮑博會做一系列的點名。當他點到某個格仔的時候,愛麗絲會告訴他那個格仔是否被某只戰艦佔據。如果是,就說hit,否則就說...