二分,分了老半天也没分出来结果,只好跑去找题解
参考:http://www.cnblogs.com/TheRoadToTheGold/p/6421882.html
这题还有O(n)解法,后边讨论里说可以转化成最大子段和。。。
using System;
using System.IO;
namespace ConsoleApplication1
{
class Program
{
private static int N, X, M;
private static int[] wood;
static void Main(string[] args)
{
StreamReader sr = new StreamReader(Console.OpenStandardInput());
StreamWriter sw = new StreamWriter(Console.OpenStandardOutput());
string[] input = sr.ReadLine().Split(' ');
N = Convert.ToInt32(input[0]);
X = Convert.ToInt32(input[1]);
M = Convert.ToInt32(input[2]);
wood = new int[N];
for (int i = 0; i < N; ++i)
wood[i] = Convert.ToInt32(sr.ReadLine());
int temp = X * 2 * N;
if (temp > M)
{
sw.WriteLine(-1);
}
else
{
sw.WriteLine(solve());
}
sw.Flush();
sr.Close();
sw.Close();
}
public static int solve()
{
int lb = 0;
int ub = M;
while (lb <= ub)
{
int mid = (lb + ub) / 2;
if (C(mid)) ub = mid - 1;
else lb = mid + 1;
}
return lb;
}
public static bool C(int d)
{
int head = 0;
int tail = 0;
for (int i = 0; i < N; ++i)
{
head = tail;
if (head + X + d <= wood[i])
{
head = Math.Max(head, wood[i] - d - X);
tail = head + 2 * X;
}
else
{
if (head + X - wood[i] > d) return false;
tail = tail + 2 * X;
}
if (tail > M)
return false;
}
return true;
}
}
}