公平分队II

时间限制:10000ms
单点时限:1000ms
内存限制:256MB

描述

小Hi和小Ho在玩一个战争游戏。游戏中2N个战斗单位,战斗力分别是1~2N。

现在小Hi和小Ho要各选N个单位组成队伍,当然他们都希望自己队伍的总战斗力越大越好。

为了使分队更加公平,经过亲切友好的磋商,小Hi和小Ho达成共识按照以下步骤确定分队:

  1. 小Hi将2N个单位分成两队,每队N个战斗单位;

  2. 然后小Ho选择其中一队,把另一队给小Hi;

  3. 小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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值