首页 > 其他分享 >P1056 NOIP2008 普及组 排座椅

P1056 NOIP2008 普及组 排座椅

时间:2023-09-19 13:55:19浏览次数:47  
标签:同学 int NOIP2008 ++ 座椅 P1056 x2 x1 mx

\(P1056\) [\(NOIP2008\) 普及组] 排座椅 题解

先想一下算法:因为题目里出现了 最优解 , 最好的方案 关键字,所以一定会用 贪心。然后从题目给的样例解释可以看到:如果相邻的两行有许多组说话的同学,那么在这两行中间加一条过道是非常划算的;同理,列也是如此。

恍然大悟,只要找出划分哪些相邻的两行和相邻的两列可以隔开的同学最多,此题可解。

接下来是找规律:

  • 我们先定义两个数组\(x,y\):

    • \(x[1]\)表示如果在第一列与第二列中间划分过道能够分开几组说话的同学,同理,\(x[2]\)则是第二列与第三列... 直到\(x[n-1]\)
    • \(y[1]\)表示第一行与第二行,\(y[2]\)表示第二行与第三行... 直到\(y[m-1]\)
  • 题目输入两个同学的坐标,如果横坐标相同,即这两个同学在一行,那么设两个同学纵坐标分别为\(a,b\) 如果\(a<b\) 那么\(x[a]++\) 否则\(x[b]++\)(这里一定要特判一下\(a\)和\(b\)的大小) 同理 \(y\) 数组也如此操作即可。

  • 最后\(x,y\)数组分别扫一遍,然后桶排一下即可。

#include <bits/stdc++.h>
using namespace std;
const int N = 1010;

int m, n, k, l, d; // m行n列,k条横向的通道,l条纵向的通道,d对同学交头接耳
int y[N], x[N];    // 横纵坐标数组
int b1[N], b2[N];  // 桶排要用的数组

int main() {
    cin >> m >> n >> k >> l >> d;

    while (d--) {
        int x1, y1, x2, y2;
        cin >> x1 >> y1 >> x2 >> y2;
        if (x1 == x2)         // 横坐标相等,则记录到个数数组中
            y[min(y1, y2)]++; // 表示隔开这两排的价值
        else
            x[min(x1, x2)]++; // 记得取min,即过道与前一个坐标保持一致
    }

    for (int i = 1; i <= k; i++) { // 循环k次
        int mx = 0;                // 临时最大值
        int p;                     // 临时最大值位置
        for (int j = 1; j <= m; j++) {
            if (x[j] > mx) {
                mx = x[j];
                p = j;
            }
        }
        x[p] = 0; // 求出max之后一定要记得清零!!否则无论排多少次都是一个答案
        b1[p]++;  // p这行是需要加入过道的
    }

    for (int i = 1; i <= l; i++) {
        int mx = 0;
        int p;
        for (int j = 1; j <= n; j++) {
            if (y[j] > mx) {
                mx = y[j];
                p = j;
            }
        }
        y[p] = 0; // 同上
        b2[p]++;  // p这列是需要加入过道的
    }

    // 输出答案
    for (int i = 1; i <= m; i++)
        if (b1[i]) printf("%d ", i); // 表示需要隔开这行

    puts("");

    for (int i = 1; i <= n; i++)
        if (b2[i]) printf("%d ", i);
    return 0;
}

标签:同学,int,NOIP2008,++,座椅,P1056,x2,x1,mx
From: https://www.cnblogs.com/littlehb/p/17714427.html

相关文章

  • 应用案例|基于高精度三维机器视觉的检测汽车座椅应用
    Part.1 项目背景检测汽车座椅是一个复杂的应用场景,需要综合运用多种技术和算法来实现。在这个场景中,通过使用3D视觉技术来感知汽车座椅的位置、形状和特征,使用摄像头或激光扫描仪等设备来获取汽车座椅的三维信息。然后利用这些信息来准确地定位和检测汽车座椅的各个部分,例如头枕、......
  • 「NOIP2008 普及组」ISBN 号码 题解
    前言转自博客,早期黑历史作品。这是本蒟蒻の第一篇题解qwq,发在博客上,还请多多关照.这道题是一道橙题,难度没有太大的问题,对于大犇们来说自然是一遍过的,本蒟就只能调调再交了.题面传送门题目描述每一本正式出版的图书都有一个ISBN号码与之对应,ISBN码包括99位数字、1......
  • P1056 [NOIP2008 普及组] 排座椅
    1.变量maxn和g在for循环内声明和初始化,是因为它们用于追踪每次循环中的最大值及其对应的索引。如果将maxn和g的声明移到for循环外部,它们将保留上一次迭代的值,并且比较语句if(a[j]>maxn)或if(b[j]>maxn)将无法正常工作。在每次迭代中将它们初始化为-1的目的......
  • P1055 [NOIP2008 普及组] ISBN 号码
    [NOIP2008普及组]ISBN号码题目描述每一本正式出版的图书都有一个ISBN号码与之对应,ISBN码包括$9$位数字、$1$位识别码和$3$位分隔符,其规定格式如x-xxx-xxxxx-x,其中符号-就是分隔符(键盘上的减号),最后一位是识别码,例如0-670-82162-4就是一个标准的ISBN码。ISBN码......
  • [NOIP2008 提高组] 笨小猴
    [NOIP2008提高组]笨小猴题目描述笨小猴的词汇量很小,所以每次做英语选择题的时候都很头疼。但是他找到了一种方法,经试验证明,用这种方法去选择选项的时候选对的几率非常大!这种方法的具体描述如下:假设\(\text{maxn}\)是单词中出现次数最多的字母的出现次数,\(\text{minn}\)是......
  • 「NOIP2008」笨小猴
    笨小猴的词汇量很小,所以每次做英语选择题的时候都很头疼。但是他找到了一种方法,经试验证明,用这种方法去选择选项的时候选对的几率非常大!这种方法的具体描述如下:假设maxn是单词中出现次数最多的字母的出现次数,minn是单词中出现次数最少的字母的出现次数,如果maxn-minn是一个质......
  • P1149 [NOIP2008 提高组] 火柴棒等式 题解
    [NOIP2008提高组]火柴棒等式题目描述给你\(n\)根火柴棍,你可以拼出多少个形如\(A+B=C\)的等式?等式中的\(A\)、\(B\)、\(C\)是用火柴棍拼出的整数(若该数非零,则最高......
  • P1149 [NOIP2008 提高组] 火柴棒等式
    题目描述给你 nn根火柴棍,你可以拼出多少个形如 A+B=C的等式?等式中的 A、B、C是用火柴棍拼出的整数(若该数非零,则最高位不能是 0)。用火柴棍拼数字 0∼9 的拼法如图所......
  • 洛谷P1149 [NOIP2008 提高组] 火柴棒等式
    这道题就是一个经典的暴力枚举题意是输出一共有的火柴根数,输出这些火柴棒用完可以有多少拼法下面,我们来数一数拼成十个数和两个符号(’+‘&&’=‘)各用几根火柴棒0要用......
  • 洛谷P1149 [NOIP2008 提高组] 火柴棒等式
    这道题其实很简单只是个暴力枚举!!!题目大致意思是说给你一堆火柴棒,两个符号(‘+’&&‘-’)。第一个数字‘0’用了6根火柴棒,‘1’用了2根火柴棒,依此类推......这样,我们就能......