標籤:好題 枚舉
題意:在一條直線上有n個點,取一長度差為x的區間, 規定點必須是區間的端點, 讓你找出來最大的x
策略:rt
分析可得:兩個相鄰點之間的區間要麼是兩個點的差,要麼就是兩個點的差的一半,那我們就簡單枚舉一下就好了
排好序之後再枚舉
代碼:
#include <cstdio>#include <cstring>#include <algorithm>#include <cmath>#define M 200using namespace std;double s[M];double init[M];int t;bool greedy(double max){ int i; int flag = 0; for(i = 1; i < t-1; i ++){ if((!flag&&init[i]-init[i-1] >= max)||(flag&&((init[i]-init[i-1])/2>=max||init[i]-init[i-1] == max))){ //flag == 0代表的意思是取右面的區間, flag = 1代表取左邊的的區間。在flag = 1的時候,可以取一半也可以取整個區間 flag = 0; } else if(init[i+1]-init[i] >= max){ flag = 1; } else return 0; } return 1;}void sear(int tot){ int i; for(i = tot-1; i >= 0; i --){ if(greedy(s[i])){ printf("%.3lf\n", s[i]); break; } }}int main(){ int i, n; scanf("%d", &n); while(n --){ scanf("%d", &t); for(i = 0; i < t; i ++){ scanf("%lf", &init[i]); } sort(init, init+t); int tot = 0; for(i = 1; i < t; i ++){ s[tot++] = init[i]-init[i-1]; s[tot] = s[tot-1]/2; tot++; } sort(s, s+tot); sear(tot); } return 0;}
hdoj 4932 Miaomiao's Geometry 【暴力枚舉】