船长l,有k艘,n个格子,m发炮弹。设可以放x艘船,因为每艘船间有一个空格,设有g个格子可以放。即(x-1)*(l+l)+l<=g。x=(g+1)/(l+1)。于是可以用二分查找法。
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int N=200005;
int a[N],pos[N];
int n,k,L,m;
int NUM(int l)
{
return (l+1)/(L+1);
}
int check(int p)
{
int cnt=0;
for(int i=1;i<=p;i++)
a[i]=pos[i];
sort(a+1,a+p+1);
for(int i=2;i<=p;i++)
{
cnt+=NUM(a[i]-a[i-1]-1);
}
cnt+=NUM(a[1]-1);
cnt+=NUM(n-a[p]);
if(cnt>=k) return true;
return false;
}
int main()
{
while(cin>>n>>k>>L)
{
cin>>m;
for(int i=1;i<=m;i++) cin>>pos[i];
int l=1,r=m;
while(r>l)
{
int mid=(r+l)>>1;
if(check(mid)) l=mid+1;
else r=mid;
}
if(check(m))
cout<<-1<<endl;
else
cout<<l<<endl;
}
return 0;
}
不过这种方法时间有点长了。
我晕,如果我将代码中的cin,cout全部改成scanf,printf,代码运行时间将只有原来运行时间的0.1.涨知识了。