10.18 T2

Chess
【题目描述】
有 N 个人要参加国际象棋比赛,该比赛要进行 K场对弈。
每个人最多参加两场对弈,最少参加零场对弈。
每个人都有一个与其他人都不相同的等级(用一个正整数来表示)。
在对弈中,等级高的人必须用黑色的棋子,等级低的人必须用白色的棋子。
每个人最多只能用一次黑色的棋子和一次白色的棋子。
为了增加比赛的客观度,观众希望 K场对弈中双方等级差的总和最小。
比如有 7 个选手,他们的等级分别是 30,17,26,41,19,38,18,要进
行 3 场比赛。最好的安排是 Player2 vs Player 7,Player7 vs Player 5,Player6
vs Player 4,此时等级差的总和等于(18-17)+(19-18)+(41-38)=5达到
最小。
【输入文件】
第一行两个正整数 N,K。
接下来有 N 行,第 i 行表示第 i-1 个人等级。
【输出文件】
在第一行输出最小的等级差的总和。
【输入输出样例】
输入
7 3
30
17
26
41
19
38
18
输出
5
【数据规模】
在 60%的数据中,1<=N<=3000;
在 100%的数据中,1<= N<=100000;
保证所有输入数据中等级的值小于10^8,1<=K<=N-1;


对于数组开小了表示一下沉痛哀悼

惨案现场:…………dp怎么写,好难转移
贪心可以搞….sort一下后,相邻的等级差最下;
求出等级差后再sort一边 ,去前K个就好了…..
然后呢,dp是冲着90pts去的,3000的数组
然后改成贪心,数组忘改了…….
后来呢 发现题面错了,3000是60pts
然后就60………………..

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
int level[101000],temp[101000],ans=0;//死亡现场
int n,k;
int main(){
    freopen("chess.in","r",stdin);
    freopen("chess.out","w",stdout);
    scanf("%d%d",&n,&k);
    for(int i=1;i<=n;i++)
    cin>>level[i];

    sort(level+1,level+n+1);
    for(int i=1;i<n;i++)
    temp[i]=level[i+1]-level[i];
    sort(temp+1,temp+n);
    for(int i=1;i<=k;i++)
    ans+=temp[i];
    printf("%d",ans);
    return 0;
}

做题的套路还是要有的。

做完之后要检查,知道就要去做…

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值