2022.5.5 AcWing每日一題
阿新 • • 發佈:2022-05-05
簽到 細節處理
答案只可能在 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; }