P1056 [NOIP2008 普及组] 排座椅

https://www.luogu.com.cn/problem/P1056
贪心,排序
黄色题
思路一:找出划分哪些相邻的两行和相邻的两列可以隔开的同学最多
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std; 
int m,n,k,l,d;//变量名最好起与题目一致的 
int x[1005],y[1005];//横纵坐标数组 
int c[1005],o[1005];//桶排要用的数组
int main() {
    scanf("%d%d%d%d%d",&m,&n,&k,&l,&d); 
    for(int i=1;i<=d;i++) { 
        int xi,yi,pi,qi; 
        scanf("%d%d%d%d",&xi,&yi,&pi,&qi); 
        if(xi==pi) 
            x[min(yi,qi)]++;//表示隔开这两排的价值 
        else 
            y[min(xi,pi)]++; //记得取min,即过道与前一个坐标保持一致 
    } 
    for(int i=1;i<=k;i++){//开始桶排 
        int maxn=-1;//为了求出每次的最大值,需要每次扫一遍 
        int p; 
        for(int j=1;j<m;j++){ 
            if(y[j]>maxn){ 
                maxn=y[j]; 
                p=j; 
            } 
        } 
        y[p]=0;//求出max之后一定要记得清零!!否则无论排多少次都是一个答案 
        c[p]++;//桶排不解释 
    } 
    for(int i=1;i<=l;i++){ 
        int maxn=-1; 
        int p; 
        for(int j=1;j<n;j++){ 
            if(x[j]>maxn){ 
                maxn=x[j]; 
                p=j; 
            } 
        } 
        x[p]=0; //同上 
        o[p]++; 
    } 
    for(int i=0;i<1005;i++)//输出答案 
    { 
        if(c[i])//表示需要隔开这行 
            printf("%d ",i); 
    } 
    printf("\n"); 
    for(int i=0;i<1005;i++) 
    { 
        if(o[i]) 
            printf("%d ",i); //同上 
    } 
    return 0; 
}

思路二:结构体+排序

#include<iostream>
#include<algorithm>
using namespace std;
struct A
{
    int n,p;//n用来存可以隔开的人数,p用来存隔开的道路
}k[1005],l[1005];

bool cmp(A x,A y)
{
    return x.n>y.n;
}

bool cmp1(A x,A y)
{
    return x.p<y.p;
}

int d,n,m,p,q,x1,x2,y1,y2,i1=0,j1=0;
int main()
{
    cin>>m>>n>>p>>q>>d;//l k用 p q 替代了;
    for(int i=1;i<=d;i++)
    {
        cin>>x1>>y1>>x2>>y2;
        if(x1==x2) 
        {
        l[min(y1,y2)].p=min(y1,y2);
        l[min(y1,y2)].n++;
        }
        else 
        {
        k[min(x1,x2)].p=min(x1,x2);
        k[min(x1,x2)].n++;
        }
    }//简单的输入+判断(因为题目说明了不是x1==x2就是y1==y2);
    sort(l+1,l+n+1,cmp);//这是P党该羡慕的吧。。
    sort(k+1,k+m+1,cmp);//这里是贪心,找到可以隔开人数最多的路,那么说话的人就少了
    sort(l+1,l+q+1,cmp1);
    sort(k+1,k+p+1,cmp1);//奇怪的坑,WA了两次才晓得要排序。。。
    for(int i=1;i<=p;i++) cout<<k[i].p<<" ";
    cout<<endl;
    for(int i=1;i<=q;i++) cout<<l[i].p<<" ";
    return 0;
}

 

posted @ 2022-08-09 08:05  -イレイナ  阅读(113)  评论(0)    收藏  举报