Enduring Exodus CodeForces - 655C (二分)

链接

大意: n个房间, 1为占用, 0为未占用, John要将k头奶牛和自己分进k+1个空房间, 求John距最远的奶牛距离的最小值

 

 

这种简单题卡了20min....

显然对于固定的k+1个房间, 只需要John在最接近中央的房间即可, 枚举每k个房间, 找出最接近的就行了

这样复杂度是$O(nlogk)$

还可以直接二分答案, 复杂度$O(nlogn)$

 

#include 
#include 
#include 
#define REP(i,a,n) for(int i=a;i<=n;++i)
using namespace std;

const int N = 4e5+10;
int n, k;
int a[N];
char s[N];

int main() {
	scanf("%d%d%s", &n, &k, s+1);
	REP(i,1,n) if (s[i]=='0') a[++*a] = i;
	n = *a;
	int ans = 1e9;
	REP(i,1,n-k) {
		int j = i+k;
		int p = lower_bound(a+i,a+j+1,(a[i]+a[j])/2)-a-1;
		REP(r,p,p+3) if (i<=r&&r<=j) {
			ans = min(ans, max(abs(a[i]-a[r]),abs(a[j]-a[r])));
		}
	}
	printf("%d\n", ans);
}

 

转载于:https://www.cnblogs.com/uid001/p/10410673.html

你可能感兴趣的:(Enduring Exodus CodeForces - 655C (二分))