老年人求助关于阴间的精度 qwq
查看原帖
老年人求助关于阴间的精度 qwq
298549
SIXIANG32楼主2022/12/20 10:35

如题,就是二分对吧,然后由于老年人很久没有写代码了有些小细节怎么写看不出来了,还望各位巨佬斧正 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();
} 
2022/12/20 10:35
加载中...