比赛 4043级NOIP2022欢乐赛7th 评测结果 C
题目名称 愤怒的奶牛 最终得分 0
用户昵称 ZRQ 运行时间 0.000 s
代码语言 C++ 内存使用 0.00 MiB
提交时间 2022-11-20 11:33:28
显示代码纯文本
  1. #include<bits/stdc++.h>
  2. #define ll long long
  3. #define inf 0x3f3f3f3f
  4. using namespace std;
  5. const int N=550000;
  6. int n;
  7. double l[N],r[N];
  8. double a[N];
  9. void pre()
  10. {
  11. l[1]=0;
  12. for(int i=2;i<=n;i++)
  13. {
  14. l[i]=inf;
  15. int low=1,high=i;
  16. while(low+1<high)
  17. {
  18. int mid=(low+high)/2;
  19. if(l[mid-1]+1<a[i]-a[mid-1]) low=mid;
  20. else high=mid;
  21. }
  22. l[i]=min(max(a[i]-a[low-1],l[low-1]+1),max(a[i]-a[high-1],l[high-1]+1));
  23. }
  24. r[n]=0;
  25. for(int i=n-1;i>=1;i--)
  26. {
  27. r[i]=inf;
  28. int low=i,high=n;
  29. while(low+1<high)
  30. {
  31. int mid=(low+high)/2;
  32. if(r[mid+1]+1<a[mid+1]-a[i]) high=mid;
  33. else low=mid;
  34. }
  35. r[i]=min(max(a[low+1]-a[i],r[low+1]+1),max(a[high+1]-a[i],r[high+1]+1));
  36. }
  37. }
  38. bool ifok(double x)
  39. {
  40. for(int i=n;i>=1;i--)
  41. {
  42. if(l[i]+1<=x)
  43. {
  44. for(int j=1;j<=n&&a[j]<=a[i]+2*x;j++)
  45. {
  46. if(r[j]+1<=x) return true;
  47. }
  48. break;
  49. }
  50. }
  51. return false;
  52. }
  53. int main()
  54. {
  55. freopen("angry.in","r",stdin);
  56. freopen("angry.out","w",stdout)
  57. scanf("%d",&n);
  58. for(int i=1;i<=n;i++)
  59. {
  60. scanf("%lf",&a[i]);
  61. }
  62. sort(a+1,a+1+n);
  63. pre();
  64. double low=1,high=a[n];
  65. while(high-low>0.01)
  66. {
  67. double mid=(low+high)/2;
  68. if(ifok(mid)) high=mid;
  69. else low=mid;
  70. }
  71. printf("%.1f\n",low);
  72. return 0;
  73. }