zoukankan      html  css  js  c++  java
  • 洛谷 P1626 象棋比赛

    题目描述

    有N个人要参加国际象棋比赛,该比赛要进行K场对弈。每个人最多参加两场对弈,最少参加零场对弈。每个人都有一个与其他人不相同的等级(用一个正整数来表示)。

    在对弈中,等级高的人必须用黑色的棋子,等级低的人必须用白色的棋子。每个人最多只能用一次黑色的棋子和一次白色的棋子。为增加比赛的可观度,观众希望K场对弈中双方的等级差的总和最小。

    比如有7个选手,他们的等级分别是30,17,26,41,19,38,18,要进行3场比赛。最好的安排是选手2对选手7,选手7对选手5,选手6对选手4。此时等级差的总和等于(18-17)+(19-18)+(41-38)=5达到最小。

    输入输出格式

    输入格式:

     

    第一行两个正整数N,K

    接下来有N行,第i行表示第i+1个人等级。

    [数据规模]

    在90%的数据中,1≤N≤3000;

    在100%的数据中,1≤N≤100000;

    保证所有输入数据中等级的值小于100000000,1≤K≤N-1。

     

    输出格式:

     

    在第一行输出最小的等级差的总和。

     

    输入输出样例

    输入样例#1: 复制
    7 3
    30
    17
    26
    41
    19
    38
    18
    输出样例#1: 复制
    5
    思路:贪心
    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    using namespace std;
    int n,m,ans;
    int num[100001];
    struct nond{
        int l,r,dis;
    }v[100001];
    bool cmp(nond a,nond b){
        return a.dis<b.dis;
    }
    int main(){
        scanf("%d%d",&n,&m);
        for(int i=1;i<=n;i++)
            scanf("%d",&num[i]);
        sort(num+1,num+1+n);
        for(int i=1;i<n;i++){
            v[i].l=num[i];
            v[i].r=num[i+1];
            v[i].dis=num[i+1]-num[i];        
        }
        sort(v+1,v+1+n-1,cmp);
        for(int i=1;i<=m;i++)
            ans+=v[i].dis;
        cout<<ans;
    }
     
    细雨斜风作晓寒。淡烟疏柳媚晴滩。入淮清洛渐漫漫。 雪沫乳花浮午盏,蓼茸蒿笋试春盘。人间有味是清欢。
  • 相关阅读:
    k-d tree
    K近邻算法-KNN
    ORB特征提取与匹配
    ZeroMQ一个更小、更快、更简单的智能传输层协议
    ROS导航之参数配置和自适应蒙特卡罗定位
    cmake实战第二篇:让我们的代码更像个工程
    gcc/g++实战之动态链接库与静态链接库编写
    gcc/g++ 实战之编译的四个过程
    通过 LPeg 介绍解析表达式语法(Parsing Expression Grammars)
    Forth 语言概要
  • 原文地址:https://www.cnblogs.com/cangT-Tlan/p/7853619.html
Copyright © 2011-2022 走看看