UVALive 3177 长城守卫

/**

题意: 有n(1<=n<=100 000)个人围成一个圈,  其中第i个人想要r[i](1<= r[i] <= 100 000)个礼物;

求要使任意相邻的两个人没有相同礼物的最小总礼物数


Sample Input :

5
2 2 2 2 2

sample Outpu:

5



分析 :

n为偶数时很简单 : ans = max(r[i] + r[i+1]);

n为奇数时比较棘手:
既然求最值,试试二分
那对于给定答案怎样确定是否符合条件呢?

对于给定的礼物数q,设第一个人的礼物为1~r1
最优分配方案:编号为奇数的人尽量往后取,编号为偶数的人尽量往前取

将其按a[0]分为两部分:左部分a[0]个,右部分q-a[0]个;
然后i为奇数的人尽量取左边,偶数i尽量取右边.
若最后一个人一个左部分的都没有取到,则符合条件,
否则不符合条件

要怎么记录取值呢?
两个数组,left[i]记录取左边的个数,right[i]记录取右边的个数

*/


#include 
#define scf(n) scanf("%d",&n)
#define cao(n) cout<





你可能感兴趣的:(大白例题)