【JZOJ1305】Chess

为了提高国际象棋比赛的观赏性,需要安排N位等级各不相同的选手进行K场对弈,每场对弈中等级高者执黑,低者执白,每人最多两次对弈,黑白各一次。目标是最小化所有对弈的等级差总和。例如,7名选手按等级排序后,通过特定安排可以使得3场比赛的等级差总和达到最小,即5。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

description

有N个人要参加国际象棋比赛,该比赛要进行K场对弈。
  每个人最多参加两场对弈,最少参加零场对弈。
  每个人都有一个与其他人都不相同的等级(用一个正整数来表示)。
  在对弈中,等级高的人必须用黑色的棋子,等级低的人必须用白色的棋子。
  每一个人最多只能用一次黑色的棋子和一次白色的棋子。为了增加比赛的可观度,观众希望K场对弈中双方的等级
差的总和最小。
  比如有7个选手,他们的等级分别是30; 17; 26; 41; 19; 38; 18,要进行3场比赛。最好的安排是Player 2 vs Player 7, Player
7 vs Player 5 , Player 6 vs Player 4,此时等级差的总和等于(18 ¡ 17) + (19 ¡ 18) + (41 ¡ 38) = 5达到最小。


analysis

  • 先排个序,把两两之差再排个序

code

#pragma GCC optimize("O3")
#pragma G++ optimize("O3")
#include<stdio.h>
#include<string.h>
#include<algorithm>
#define MAXN 100005
#define ll long long
#define reg register ll
#define fo(i,a,b) for (reg i=a;i<=b;++i)
#define fd(i,a,b) for (reg i=a;i>=b;--i)
#define O3 __attribute__((optimize("-O3")))

using namespace std;

ll a[MAXN];
ll n,k,ans;

O3 inline ll read()
{
	ll x=0,f=1;char ch=getchar();
	while (ch<'0' || '9'<ch){if (ch=='-')f=-1;ch=getchar();}
	while ('0'<=ch && ch<='9')x=x*10+ch-'0',ch=getchar();
	return x*f;
}
O3 int main()
{
	n=read(),k=read();
	fo(i,0,n-1)a[i]=read();
	sort(a,a+n);
	fd(i,n-1,1)a[i]-=a[i-1];
	sort(a+1,a+n);
	fo(i,1,k)ans+=a[i];
	printf("%lld\n",ans);
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值