1521 一維戰艦
codeforces
基準時間限制:1 秒 空間限制:131072 kb 分值: 10
難度:2級演算法題
愛麗絲和鮑博喜歡玩一維戰艦的遊戲。他們在一行有n個方格的紙上玩這個遊戲(也就是1×n的**)。
在遊戲開始的時候,愛麗絲放k個戰艦在這個**中,並不把具體位置告訴鮑博。每乙隻戰艦的形狀是 1×a 的長方形(也就是說,戰艦會佔據a個連續的方格)。這些戰艦不能相互重疊,也不能相接觸。
然後鮑博會做一系列的點名。當他點到某個格仔的時候,愛麗絲會告訴他那個格仔是否被某只戰艦佔據。如果是,就說hit,否則就說miss。
但是這兒有乙個問題!愛麗絲喜歡撒謊。他每次都會告訴鮑博miss。
請你幫助鮑博證明愛麗絲撒謊了,請找出哪一步之後愛麗絲肯定撒謊了。
input
單組測試資料。output第一行有三個整數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編號。
輸出乙個整數,表示最早一次能夠證明愛麗絲一定撒謊的點名編號。如果不能證明,輸出-1。點名的編號依次從1到m編號。input示例
樣例1output示例11 3 3
54 8 6 1 11
樣例25 1 3
21 5
樣例輸出13樣例輸出2
-1這道題目斷斷續續想了2個星期,23333沒有想起來,最後看網上的都是用set
寫的,沒有學過,這是看了網上的題解寫的,題意不能重疊,不能接觸,那對於
n個格仔最多能放max_num=(n+1)/(a+1);說一下**的本質:在乙個區間中
每輸入一點,我們就可以算出在這個區間中增加1個點可以減少多少個
船艦就行了
#include#includeint flag[300000];
int len[300000];
int main()
{ memset(flag,0,sizeof(flag));
int n,k,a;
scanf("%d%d%d",&n,&k,&a);
int max_num=(n+1)/(a+1);//n個格仔可以儲存的最多船艦數
int i,l,r,m,mid;
scanf("%d",&m);
for(i=1;i<=m;++i)
scanf("%d",&len[i]);
int tag=0,num=0,num2=0;
for(i=1;i<=m;++i)
{ l=len[i]-1;r=len[i]+1;
flag[len[i]]=1;
while(l>=1&&!flag[l])//從左右向外擴散
--l;
while(r<=n&&!flag[r])
++r;
num=(r-l)/(a+1);
num2=(len[i]-l)/(a+1)+(r-len[i])/(a+1);
max_num-=(num-num2);
if(max_num
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,否則就說...