[NOIP2008]排座椅

简介: [NOIP2008]排座椅

题目: [NOIP2008]排座椅 ,哈哈,我们今天来看一道稍微复杂一点贪心算法的题嘛,这是选自NOIP普及组上的一道题,好了,我们一起来看看题意吧:

题目描述是复制的,可能有部分显示不对,我就把题目链接放下面!

题目链接: [NOIP2008]排座椅

题目描述

上课的时候总有一些同学和前后左右的人交头接耳,这是令小学班主任十分头疼的一件事情。不过,班主任小雪发现了一些有趣的现象,当同学们的座次确定下来之后,只有有限的D对同学上课时会交头接耳。同学们在教室中坐成了M行N列,坐在第i行第j列的同学的位置是(i,j),为了方便同学们进出,在教室中设置了K条横向的通道,L条纵向的通道。于是,聪明的小雪想到了一个办法,或许可以减少上课时学生交头接耳的问题:她打算重新摆放桌椅,改变同学们桌椅间通道的位置,因为如果一条通道隔开了两个会交头接耳的同学,那么他们就不会交头接耳了。

请你帮忙给小雪编写一个程序,给出最好的通道划分方案。在该方案下,上课时交头接耳的学生对数最少。

输入描述

第一行,有5各用空格隔开的整数,分别是M,N,K,L,D(2 ≤ N,M ≤ 1000,0 ≤ K < M,0 ≤ L < N,D ≤ 2000)。

接下来D行,每行有4个用空格隔开的整数,第i行的4个整数Xi,Yi,Pi,Qi,表示坐在位置(Xi,Yi)与(Pi,Qi)的两个同学会交头接耳(输入保证他们前后相邻或者左右相邻)。

输入数据保证最优方案的唯一性。

输出描述

示例1

输入

4 5 1 2 3

4 2 4 3

2 3 3 3

2 5 2 4

输出

2

2 4

思路:

我们贪心策略是纵向与横向可以隔开多的学生,本题有很多的细节,具体的就看代码吧,有注释的!

我们来看看成功AC的代码吧:

#include<bits/stdc++.h>
using namespace std;
int m,n,k,l,d;//教室m行n列,设置k条横向L条纵向通道,d对爱讲话的同学
struct node{
    int pos,num;//pos表示处于的行或列,num表示当前 纵向或横向 可以隔开的人数
}heng[1010],zong[1010];
bool cmp1(node x,node y){ return x.num>y.num;}
bool cmp2(node x,node y) { return x.pos<y.pos;}
int main(){
    cin.tie(0);
    ios::sync_with_stdio(false);
    cin>>m>>n>>k>>l>>d;
    for(int i=1;i<=max(n,m);i++) heng[i].pos=i,zong[i].pos=i;
    for(int i=1;i<=d;i++){
        int x,y,p,q;    cin>>x>>y>>p>>q;
        if(x==p) zong[min(y,q)].num++;//x==p的话,说明我们纵向可以隔开,这一纵向可以隔开的人数+1
        else heng[min(x,p)].num++;//这就是横向的,类比纵向的
    }
    //贪心的排序,把纵向与横向可以隔开的人多的排在前面
    sort(zong+1,zong+1+n,cmp1);
    sort(heng+1,heng+1+n,cmp1);
    //由于题目要我们输出的是坐标(从小到大),所以我们再排序一次
    sort(zong+1,zong+1+l,cmp2);
    sort(heng+1,heng+1+k,cmp2);
    //输出结果
    for(int i=1;i<=k;i++) cout<<heng[i].pos<<" ";
    cout<<"\n";
    for(int i=1;i<=l;i++) cout<<zong[i].pos<<" ";
    return 0;
}


相关文章
|
10天前
【洛谷 P1307】[NOIP2011 普及组] 数字反转 题解(取余)
NOIP2011普及组试题,要求反转整数N的位得到新数,保持正负号和非零最高位。输入一个整数N,输出反转后的新数。样例输入1:123,输出:321;样例输入2:-380,输出:-83。代码使用取余法实现,处理负数时保留符号。
8 0
|
10天前
|
存储 C++
【洛谷 P1089】[NOIP2004 提高组] 津津的储蓄计划 题解(循环)
**摘要:** 这是一个关于编程竞赛题目的摘要,题目编号NOIP2004提高组,名为“津津的储蓄计划”。津津每月初从妈妈那里获得300元,需要根据预算决定储蓄。若预计月底有超过或正好100元,她会存储整百金额。如果某月资金不足预算,输出第一个这样的月份加负号;否则,计算年末时津津手中的总金额(储蓄部分加20%)。输入是12个月的预算,输出是一个整数结果。提供的C++代码示例用于处理这个问题,通过迭代计算每个月的资金状况。样例输入和输出展示了不同情况下的结果。
9 0
|
10天前
【洛谷 P2669】[NOIP2015 普及组] 金币 题解(循环)
`NOIP2015`普及组题目,骑士按周期领金币:第一天1枚,随后$n$天每天$n$枚,然后$n+1$天每天$n+1$枚。给定天数$k$,求总金币数。输入$k$,输出金币总数。样例输入6,输出14;输入1000,输出29820。代码使用循环和变量控制周期,累计金币数。
13 0
|
10天前
|
算法
【洛谷 P1003】[NOIP2011 提高组] 铺地毯 题解(数组+贪心算法)
**NOIP2011 提高组问题:铺地毯** 在第一象限的颁奖典礼场地,有$n$张地毯按编号顺序铺设。需找出覆盖特定点$(x, y)$的最上方地毯编号。输入包括地毯坐标和点坐标,输出地毯编号或-1表示未覆盖。 样例:给定3张地毯,点$(2,2)$被第3张地毯覆盖,输出3;另一样例点$(4,5)$未被覆盖,输出-1。 $30\%$数据$n\leq2$,$50\%$数据坐标$\leq100$,$100\%$数据$n\leq10^4$,坐标$\leq10^5$。 解决方法:从下到上遍历地毯,更新覆盖点的地毯编号。 AC代码略。
6 0
|
10天前
|
C++
【洛谷 P1075】[NOIP2012 普及组] 质因数分解 题解(判断质数)
NOIP2012普及组题目,给定合数$n$由两个不同质数乘积组成,求较大质数。输入一个正整数$n$,输出较大质因子。例如输入21,输出7。代码使用C++,通过循环和质数判断找到能整除$n$的质数,再求另一个质数,并输出较大者。
5 0
|
10天前
【洛谷 P1035】[NOIP2002 普及组] 级数求和 题解(循环)
**NOIP2002普及组题目:求级数$S_n=1+\frac{1}{2}+\frac{1}{3}+...+\frac{1}{n}$超过$k$的最小$n$。给定$1\leq k\leq 15$,输出满足$S_n&gt;k$的$n$。输入$1$个整数$k$,输出相应$n$。例如,输入$1$,输出$2$。代码中使用double确保精度,通过累加求和判断条件找到$n$。**
8 0
|
10月前
小乐乐排电梯
小乐乐排电梯
41 0
|
1月前
蓝桥备战--分糖果OJ2928 贪心 分类讨论
蓝桥备战--分糖果OJ2928 贪心 分类讨论
44 0
|
9月前
[NOIP2004]合并果子
[NOIP2004]合并果子
|
11月前
|
机器学习/深度学习 人工智能
1320:【例6.2】均分纸牌(Noip2002) 2020-11-30
1320:【例6.2】均分纸牌(Noip2002) 2020-11-30