如题,就是二分对吧,然后由于老年人很久没有写代码了有些小细节怎么写看不出来了,还望各位巨佬斧正 awa
//SIXIANG
#include <iostream>
#define MAXN 100000
#define QWQ cout << "QWQ" << endl;
using namespace std;
char ch[MAXN + 10];
int n, l;
double a[MAXN + 10], qz[MAXN + 10];
double Abs(double x) {
if(x < 0) return -x;
else return x;
}
bool check(double x) {
for(int p = 1; p <= n; p++)
qz[p] = qz[p - 1] + a[p] - x;
double minn = qz[0];
int ansl = 0, ansr = 0;
for(int R = l; R <= n; R++) {
int L = R - l;
if(qz[R] - minn >= -1e-6) {
ansr = R;
return 1;
}
if(qz[L] < minn + 1e-6) {
minn = qz[L];
ansl = L;
}
}
return 0;
}
void print(double x) {
for(int p = 1; p <= n; p++)
qz[p] = qz[p - 1] + a[p] - x;
double minn = qz[0];
int minl = 0, minlen = 0x7f7f7f7f, ansl = 0, ansr = 0;
for(int R = l; R <= n; R++) {
int L = R - l;
if(qz[L] < minn + 1e-6) {
minn = qz[L];
minl = L;
}
if(qz[R] - minn >= -1e-6) {
if((R - (minl + 1) + 1) <= minlen) {
if((R - (minl + 1) + 1) == minlen) {
if(minl < ansl)
ansl = minl, ansr = R;
}
else {
minlen = R - (minl + 1) + 1;
ansl = minl, ansr = R;
}
}
}
}
cout << ansl + 1 << ' ' << ansr << endl;
return ;
}
void twofen() {
double ans = 0, l = 0, r = 1;
for(int p = 1; p <= 60; p++) {
double mid = (l + r) / 2.0;
if(check(mid)) l = mid + 1, ans = mid;
else r = mid - 1;
}
print(ans);
}
void init() {
cin >> n >> l;
for(int p = 1; p <= n; p++)
cin >> ch[p], a[p] = (ch[p] == '1');
twofen();
}
int main() {
int T; cin >> T;
while(T--)
init();
}