2 条题解
-
2
这题虽然题目写的是二分,但是实际正解和二分没啥关系,是前缀和的预处理问题,想明白开关灯的状态就行了。
画图理解如下:
操作是n段内每一段都加入操作判断一下。
核心代码:
// s1 奇数前缀和, s2偶数前缀和(奇数代表d区间,偶数代表L区间) for(int i =1; i <= n ; i++) cin>>a[i]; a[++n] = m; //把m看成是一个时刻,把它放到a[n+1]里 s1[n] = s2[n] = 0; for(int i = n-1 ; i >= 0 ; i--) { s1[i] = s1[i+1]; s2[i] = s2[i+1]; if(i % 2 == 0 ) s1[i] += a[i + 1] - a[i]; else s2[i] += a[i + 1] - a[i]; } int ans = s1[0]; //一次都不按的灯亮时间总长度,注意此处维护的是后缀和 所以下标是0 for(int i = 0 ; i < n ; i++) // 从前往后枚举每个区间怎么按 { int t = a[i + 1] - a[i]; // 求一下当前区间的长度 if( t == 1) continue; //如果当前区间亮灯长度 已经是1了 ans = max(ans, s1[0] - s1[i] + s2[i+1] + t -1); // s1[0] - s1[i] 是前面的奇数区间 }
信息
- ID
- 816
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 8
- 标签
- 递交数
- 64
- 已通过
- 10
- 上传者