时间限制:10000ms
单点时限:1000ms
内存限制:256MB
描述
小Hi和小Ho在玩一个战争游戏。游戏中2N个战斗单位,战斗力分别是1~2N。
现在小Hi和小Ho要各选N个单位组成队伍,当然他们都希望自己队伍的总战斗力越大越好。
为了使分队更加公平,经过亲切友好的磋商,小Hi和小Ho达成共识按照以下步骤确定分队:
小Hi将2N个单位分成两队,每队N个战斗单位;
然后小Ho选择其中一队,把另一队给小Hi;
小Hi有权利要求交换一对战斗单位;如果他行使这项权利,他可以任选自己队中的一个战斗单位,与小Ho队中任意一个战斗单位交换。
假设小Hi和小Ho都足够机智,总是会做出让最终结果对自己最有利的选择。请你判断小Hi队伍的总战斗力最大是多少?
例如共有4个战斗单位,战斗力是1、2、3和4。那么小Hi最优的方案是分成{1, 3}和{2, 4}两组。无论小Ho选择哪一组,小Hi都可以通过交换使自己的组变成{3, 4}。
输入
第一行一个整数N。
对于30%的数据,1 ≤ N ≤ 10
对于50%的数据,1 ≤ N ≤ 25
对于100%的数据,1 ≤ N ≤ 100000
输出
一个整数表示答案。
样例输入
2
样例输出
7
分析:由步骤1、2可知,2N个战斗单位将根据战斗力尽可能均分。当不能均分时,譬如N = 3,方案为{1、4、5}和{2、3、6},此时,据步骤3知,小Ho将选择{1、4、5},这时,小Hi将用{2、3、6}中最小的2替换掉{1、4、5}中最大的5,小Hi最大战斗力为[sum{1、2 … 2*N}-(1+2)]/2+(2N-1);均分时,小Hi最大战力为sum{1、2 … 2N}/2+(2N-2)。注意N=1时要单独处理。
#include <cstdio>
#include <iostream>
using namespace std;
typedef long long ll;
int main(){
int n;
scanf("%d",&n);
if(n == 1) printf("2"); //单独处理
else{
ll s = (ll)(1+2*n)*n;
if(n%2) printf("%lld",(s-3)/2+(2*n-1));
else printf("%lld",s/2+2*n-2);
}
printf("\n");
return 0;
}