HJ171 排座椅

  • 题目
  • 题解(42)
  • 讨论(19)
  • 排行

简单 通过率:43.50% 时间限制:1秒 空间限制:50M

知识点贪心

校招时部分企业笔试将禁止编程题跳出页面,为提前适应,练习时请使用在线自测,而非本地IDE。

描述

教室内共有 nn 行 mm 列座位,坐在第 ii 行第 jj 列同学的位置记为 (i,j)(i,j)。

为了方便进出,班主任计划设置 kk 条横向通道 (贯穿整列的水平通道)与 ll 条纵向通道 (贯穿整行的竖直通道)。通道位于相邻两行(或两列)之间。

班主任记录了 dd 对经常交头接耳的同学,他们的位置 (xi,yi)(xi​,yi​) 与 (pi,qi)(pi​,qi​) 保证相邻 (上下或左右)。她希望通过合理放置通道,使尽可能多的"交头接耳"对被通道隔开。

现请你输出唯一的最优方案,在该方案下,仍未被通道隔开的"交头接耳"对的数量最少。

输入描述:

第一行输入五个整数 n,m,k,l,d(2≦n,m≦103; 0<k<n; 0<l<m; 0<d≦2×min⁡{n×m,2×103})n,m,k,l,d(2≦n,m≦103; 0<k<n; 0<l<m; 0<d≦2×min{n×m,2×103})。

接下来 dd 行,每行输入四个整数 xi,yi,pi,qixi​,yi​,pi​,qi​,表示坐标 (xi,yi)(xi​,yi​) 与 (pi,qi)(pi​,qi​) 的两位同学会交头接耳,且两坐标上下相邻或左右相邻。

保证最优方案存在且唯一。

输出描述:

第一行输出 kk 个严格递增的整数 a1,a2,...,ak(1≦a1<⋯<ak≦n−1)a1​,a2​,...,ak​(1≦a1​<⋯<ak​≦n−1),在行 aiai​ 与 ai+1ai​+1 之间设置横向通道。

第二行输出 ll 个严格递增的整数 b1,b2,...,bl(1≦b1<⋯<bl≦m−1)b1​,b2​,...,bl​(1≦b1​<⋯<bl​≦m−1),在列 bibi​ 与 bi+1bi​+1 之间设置纵向通道。

示例1

输入:

复制代码
4 5 1 2 3
4 2 4 3
2 3 3 3
2 5 2 4

复制输出:

复制代码
2
2 4

复制说明:

复制代码

该样例如下图所示,蓝底斜线方格为第一对交头接耳的同学,绿底带叉方格为第二对交头接耳的同学,粉底带星方格为第三对交头接耳的同学。粗线代表通道。该划分方案为唯一最优方案。

示例2

输入:

复制代码
2 2 1 1 4
1 1 1 2
1 1 2 1
2 1 2 2
1 2 2 2

复制输出:

复制代码
1
1
cpp 复制代码
#include <functional>
#include <iostream>
#include <unordered_map>
#include<vector>
#include<algorithm>
using namespace std;




int main() {
    int n,m,k,l,d;cin>>n>>m>>k>>l>>d;
    unordered_map<int,int>row,col;
    
    for(int i=0;i<d;i++){
        int x1,y1,x2,y2;cin>>x1>>y1>>x2>>y2;
        //贪心同行
        if(x1==x2){
            ++row[min(y1,y2)];
        }//贪心同列
        else if(y1==y2){
            ++col[min(x1,x2)];
        }
    }
    vector<pair<int,int> >vec_row,vec_col;
    for(auto&p:row){
        vec_row.emplace_back(p.second,p.first);
    }
    for(auto&p:col){
        vec_col.emplace_back(p.second,p.first);
    }
    //从大到小排序
    sort(vec_row.begin(),vec_row.end(),greater<pair<int,int> >());
    sort(vec_col.begin(),vec_col.end(),greater<pair<int,int> >());
    //输出按从小到大
    vector<int>rows,cols;
    for(int i=0;i<l&&i<vec_row.size();++i){
        rows.push_back(vec_row[i].second);
    }
    for(int i=0;i<k;++i){
        cols.push_back(vec_col[i].second);
    }
    sort(rows.begin(),rows.end());
    sort(cols.begin(),cols.end());
    for(auto&it:cols){
        cout<<it<<" ";
    }
    cout<<endl;
    for(auto&it:rows){
        cout<<it<<" ";
    }

}
// 64 位输出请用 printf("%lld")
相关推荐
liulilittle16 分钟前
并发与内存安全术语:定义、分类与关联
c++·安全·并发·术语
_wyt00120 分钟前
从图到树:9道洛谷基础题带你入门树形结构
c++·
zlinear数据采集卡24 分钟前
数据采集卡从入门到精通(10):采样率与分辨率的核心关系——反比律、架构分布与过采样
arm开发·嵌入式硬件·算法·fpga开发·架构·开源
Titan20241 小时前
Linux网络基础知识
linux·服务器·网络·c++·学习
GeekZHR2 小时前
C语言指针进阶补充6:动态内存管理、mem系列内存函数、复杂指针声明,一次补齐指针的“三大盲区“
java·c语言·算法·指针
.道阻且长.2 小时前
8.LeetCode算法习题讲解--滑动窗口--长度最小的子数组
算法·leetcode·职场和发展
(❁´◡`❁)Jimmy(❁´◡`❁)2 小时前
P1156 [USACO01OPEN] 垃圾陷阱
算法·动态规划
疯狂打码的少年2 小时前
【数据结构】二叉排序树(BST)的定义与操作
数据结构·笔记·算法
lally.3 小时前
整数等差数列超图中的三个非微扰现象
算法
Titan20243 小时前
Linux网络学习:套接字、UDP的封装与应用
linux·服务器·开发语言·网络·c++