1 solutions

  • 1
    @ 2024-9-15 11:27:22

    P1056 排座椅

    思路很简单,记录所有有关数据并排序 具体见代码

    #include<bits/stdc++.h>
    using namespace std;
    struct z{int li/*行列数据(存储编号小的)*/;int s/*能隔开多少对*/;}a[2005]/*横行*/,b[2005]/*纵列*/;//设定一个结构体,表示一条通道的数据 
    bool cmp1(z a,z b){return a.s>b.s;}
    bool cmp2(z a,z b){return a.li<b.li;}//cmp1和cmp2两个函数后面有用处 
    int m,n,k,l,d;//题目要求 
    int main(){
    	cin>>m>>n>>k>>l>>d;//输入 
    	for(int i=0;i<2000;i++){
    		a[i].li=b[i].li=i;
    		a[i].s=b[i].s=0;
    	}//初始化 
    	for(int i=0;i<d;i++){
    		int x,y,p,q;
    		cin>>x>>y>>p>>q;//不用再开数组,直接局部变量 
    		if(x==p) b[min(y,q)].s++;//如果他们在同一行,那么就在两列之间开通道,通道隔开的人数(即价值)就++ 
    		else a[min(x,p)].s++;//反之亦然 
    	}	
    	sort(a,a+m,cmp1);sort(a,a+k,cmp2);//先筛出价值最高的k条通道,再根据列数大小排序(这里就要用到cmp1,2两个函数) 
    	sort(b,b+n,cmp1);sort(b,b+l,cmp2);//b数组同理 
    	for(int i=0;i<k;i++)cout<<a[i].li<<' ';//输出 
    	cout<<'\n';
    	for(int i=0;i<l;i++)cout<<b[i].li<<' ';
    	return /*164*/0;
    }
    

    16401314

    洛谷题解

    • 1

    Information

    ID
    56
    Time
    1000ms
    Memory
    125MiB
    Difficulty
    3
    Tags
    # Submissions
    17
    Accepted
    7
    Uploaded By