HDU 4932 greedy
Miaomiao's Geometry
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)
Total Submission (s): 191 Accepted Submission (s): 38
Problem DescriptionThere are N point on X-axis. Miaomiao wowould like to cover them ALL by using segments with same length.
There are 2 limits:
1. A point is convered if there is a segments T, the point is the left end or the right end of T.
2. The length of the intersection of any two segments equals zero.
For example, point 2 is convered by [2, 4] and not convered by [1, 3]. [1, 2] and [2, 3] are legal segments, [1, 2] and [3, 4] are legal segments, but [1, 3] and [2, 4] are not (the length of intersection doesn't equals zero), [1, 3] and [3, 4] are not (not the same length ).
Miaomiao wants to maximum the length of segements, please tell her the maximum length of segments.
For your information, the point can't coincidently at the same position.
InputThere are several test cases.
There is a number T (T <= 50) on the first line which shows the number of test cases.
For each test cases, there is a number N (3 <= N <= 50) on the first line.
On the second line, there are N integers Ai (-1e9 <= Ai <= 1e9) shows the position of each point.
OutputFor each test cases, output a real number shows the answser. Please output three digit after the decimal point.
Sample Input
331 2 331 2 441 9 100 10
Sample Output
1.0002.0008.000HintFor the first sample , a legal answer is [1,2] [2,3] so the length is 1.For the second sample , a legal answer is [-1,1] [2,4] so the answer is 2.For the thired sample , a legal answer is [-7,1] , [1,9] , [10,18] , [100,108] so the answer is 8.
SourceBestCoder Round #4
Recommendhujie | We have carefully selected several similar problems for you: 4934 4933 4931 4930
It's amazing that there were 21 more than 900 players in the game ..., I didn't take into account the fact that a line segment could cover two points. In the end, I was too weak and not careful enough. In addition, I was too impatient and handed in after I had just knocked it out, as a result, there are many penalty cases. We need to change the number in the future. Note that the answer is only half the distance or distance. You can enumerate the numbers one by one. There are only two options for each point, one is to select the line segment on the left and the other is to select the line segment on the right. You must select the line on the left when selecting the left. Otherwise, select the line on the right. If neither of the left and right sides can be selected, the line segment must be long. Assume that the distance from the current enumeration is x, the condition on the left is A [j]-A [J-1]-vis [j]> = x | A [j] = A [J-1] + x, on the right is the case where a line segment covers two points. vis [j] is the influence of the previous point on the current interval.
The Code is as follows:
#include
#include
#include#include
#include
#include
#include
using namespace std;#define INF 5e9+7typedef long long LL;int main(){ //freopen("in.txt","r",stdin); long long T,N; double A[100]; double vis[100]; cin>>T; while(T--) { cin>>N; for(int i=1; i<=N; i++)cin>>A[i]; sort(A+1,A+N+1); double ans=0; A[N+1]=INF; for(int i=1; i<=N-1; i++) { memset(vis,0,sizeof(vis)); double x=A[i+1]-A[i]; bool ok1=true,ok2=true; for(int j=2; j<=N-1; j++) { if((A[j]-A[j-1]-vis[j]>=x)||(A[j]==A[j-1]+x)) { continue; } if(A[j+1]-A[j]>=x) { vis[j+1]=x; continue; } ok1=false; break; } if(ok1) { ans=max(x,ans); } memset(vis,0,sizeof(vis)); for(int j=2; j<=N-1; j++) { if(A[j]-A[j-1]-vis[j]>=x/2) { continue; } if(A[j+1]-A[j]>=x/2) { vis[j+1]=x/2; continue; } ok2=false; break; } if(ok2)ans=max(ans,x/2); } printf("%.3f\n",ans); } return 0;}