排座位·题解
2023-10-02 09:06:18
发布于:浙江
48阅读
0回复
0点赞
思路:
题目要求给定教室大小,可以分排/行的数量,会讲话的同学对数,求出分排/行的位置
根据题意,先输入n,m,l,k,d(PS:我用的n,m与l,k是反的,不影响结果)
while输入d对讲话的同学的位置,因为这对同学必然在x,y上有一个不同,有一个相同,所以可以通过判断哪个相同,将另一部分的最小值所对应的数组位置加1,表示在这个位置分隔后能分开的同学对数加1
然后,遍历数组的两层,分别加入优先队列q1,q2,q1/q2是sum大的在前面,也就是可以分开的同学对数多的在前面,这样就能尽可能使分开的同学多一点
但是还没完,因为题目要求输出的是升序队列,也就是分隔的位置小的在前面,所以还得把q1的前l个,q2的前k个放入qq1,qq2,qq1/qq2是idx小的在前面,也就是分隔的位置小的在前面,再输出,我们就实现了升序输出,end
代码:
#include<bits/stdc++.h>
using namespace std;
struct wh{
int idx,sum;
bool operator <(const wh &b) const{ 对数多在前面
return sum<b.sum;
}
};
struct wh2{
int idx,sum;
bool operator <(const wh2 &b) const{ 位置小在前面
return idx>b.idx;
}
};
priority_queue<wh> q1,q2;
priority_queue<wh2> qq1,qq2;
int nums[1010][2],n,m,l,k,d,h1,h2,l1,l2;
int main(){
cin>>n>>m>>l>>k>>d;
while(d--){
cin>>h1>>l1>>h2>>l2;
if(l1==l2){ 判断并累加
nums[min(h1,h2)][0]++;
}else{
nums[min(l1,l2)][1]++;
}
}
for(int i=1;i<n;i++) if(nums[i][0]>0) q1.push({i,nums[i][0]});
for(int i=1;i<m;i++) if(nums[i][1]>0) q2.push({i,nums[i][1]}); 遍历将数据存入q1,q2,因为是优先队列所以自动筛选
int q1s=q1.size(),q2s=q2.size(),L=min(l,q1s),K=min(k,q2s);
while(L--) qq1.push({q1.top().idx,q1.top().sum}),q1.pop(); 筛选
while(K--) qq2.push({q2.top().idx,q2.top().sum}),q2.pop();
while(qq1.size()) cout<<qq1.top().idx<<" ",qq1.pop();
cout<<endl;
while(qq2.size()) cout<<qq2.top().idx<<" ",qq2.pop();
}
这里空空如也
有帮助,赞一个