对于n个格子,可放置战舰个数为(n+1)/(a+1),当我们指定一个点时,则减少(right-left)/(a+1)-(x-left)/(a+1)-(right-x)/(a+1)。
每做一次指定点,就做一次减法运算,直至总个数<k或指定m次完毕。
AC代码:
1 #include<bits/stdc++.h> 2 using namespace std; 3 4 const int MAX=2e5+10; 5 int vis[MAX]; 6 7 int main(){ 8 int n,k,a,m,x; 9 cin>>n>>k>>a>>m; 10 int flag=-1; 11 int left,right; 12 memset(vis,0,sizeof(vis)); 13 int num=(n+1)/(a+1); 14 for(int i=0;i<m;i++){ 15 cin>>x; 16 vis[x]=1; 17 for(left=x-1;left>0&&vis[left]==0;left--); 18 for(right=x+1;right<=n&&vis[right]==0;right++); 19 num-=(right-left)/(a+1)-(x-left)/(a+1)-(right-x)/(a+1); 20 if(num<k&&flag==-1){ 21 flag=i+1; 22 break; 23 } 24 } 25 cout<<flag<<endl; 26 return 0; 27 }
原文:http://www.cnblogs.com/Kiven5197/p/7222915.html