1. 程式人生 > 其它 >2022.5.5 AcWing每日一題

2022.5.5 AcWing每日一題

簽到 細節處理

答案只可能在 n - 2 箇中間節點和 n - 1 箇中間節點的中點之間,所以直接列舉這些結果是否條件即可。
但是需要考慮到中點可能是小數,注意 int 和 double 型別的轉換。

#include <bits/stdc++.h>
using namespace std;

// 簽到
// 不允許在端點處進行摺疊
// 至少要保證選取位置的左右兩個最近斷定能對上
// 所以,答案一定在 n-2 箇中間節點和 n-1 個節點中點之間。

const int N = 1e4 + 10;

int n, l;
vector<double> node;
int st[N];
int ans = 0;
vector<double> check_area;

bool check(double x) {
//	cout << "X:" << x << endl;
	for (int i = 0; i < node.size(); i++) {
		if (2 * x < node[i])
			break;
		if (2 * x > node[i] + l)
			continue;
		if (!st[(int)(2 * x - node[i])]) {
			return false;
		}
	}
	return true;
}

int main() {
	scanf("%d %d", &n, &l);

	for (int i = 1; i <= n; i++) {
		double tmp;
		scanf("%lf", &tmp);
		node.push_back(tmp);
		st[(int)tmp] = 1;
	}

	sort(node.begin(), node.end());

	for (int i = 0; i < node.size(); i++) {
		if (i != 0 && i != node.size() - 1) {
			check_area.push_back(node[i]);
		}
		if (i != 0) {
			check_area.push_back((node[i] + node[i - 1]) / 2.0);
		}
	}

//	for (int i = 0; i < check_area.size(); i++) {
//		cout << check_area[i] << endl;
//	}

	for (int i = 0; i < check_area.size(); i++) {
		if (check(check_area[i])) {
			ans++;
		}
	}

	printf("%d\n", ans);

	return 0;
}