2 条题解
-
0
P1056 [NOIP 2008 普及组] 排座椅——题解
解题思路
每一对上下相邻学生只会被它们之间的横向通道隔开,因此给对应行间位置计数;左右相邻同理给列间位置计数。选择计数最大的 个行间位置和最大的 个列间位置即可。最后按位置升序输出。
复杂度分析
计数 ,排序 ,空间复杂度 。
C++17 参考代码
#include <bits/stdc++.h> using namespace std; struct Node{int id,c;}; int main(){ ios::sync_with_stdio(false);cin.tie(nullptr); int M,N,K,L,D;cin>>M>>N>>K>>L>>D; vector<int> r(M,0),c(N,0); for(int i=0;i<D;i++){ int x1,y1,x2,y2;cin>>x1>>y1>>x2>>y2; if(x1==x2) c[min(y1,y2)]++; else r[min(x1,x2)]++; } vector<Node> vr,vc; for(int i=1;i<M;i++) vr.push_back({i,r[i]}); for(int i=1;i<N;i++) vc.push_back({i,c[i]}); auto cmp=[](const Node&a,const Node&b){return a.c!=b.c?a.c>b.c:a.id<b.id;}; sort(vr.begin(),vr.end(),cmp);sort(vc.begin(),vc.end(),cmp); vector<int> ar,ac; for(int i=0;i<K;i++) ar.push_back(vr[i].id); for(int i=0;i<L;i++) ac.push_back(vc[i].id); sort(ar.begin(),ar.end());sort(ac.begin(),ac.end()); for(int i=0;i<K;i++) cout<<ar[i]<<(i+1==K?'\n':' '); if(K==0) cout<<'\n'; for(int i=0;i<L;i++) cout<<ac[i]<<(i+1==L?'\n':' '); if(L==0) cout<<'\n'; return 0; } -
0
#include <bits/stdc++.h> using namespace std; struct Node{int id,c;}; int main(){ ios::sync_with_stdio(false);cin.tie(nullptr); int M,N,K,L,D;cin>>M>>N>>K>>L>>D; vector r(M,0),c(N,0); for(int i=0;i<D;i++){ int x1,y1,x2,y2;cin>>x1>>y1>>x2>>y2; if(x1x2) c[min(y1,y2)]++; else r[min(x1,x2)]++; } vector vr,vc; for(int i=1;i<M;i++) vr.push_back({i,r[i]}); for(int i=1;i<N;i++) vc.push_back({i,c[i]}); auto cmp=[](const Node&a,const Node&b){return a.c!=b.c?a.c>b.c:a.id<b.id;}; sort(vr.begin(),vr.end(),cmp);sort(vc.begin(),vc.end(),cmp); vector ar,ac; for(int i=0;i<K;i++) ar.push_back(vr[i].id); for(int i=0;i<L;i++) ac.push_back(vc[i].id); sort(ar.begin(),ar.end());sort(ac.begin(),ac.end()); for(int i=0;i<K;i++) cout<<ar[i]<<(i+1K?'\n':' '); if(K0) cout<<'\n'; for(int i=0;i<L;i++) cout<<ac[i]<<(i+1L?'\n':' '); if(L==0) cout<<'\n'; return 0; }
- 1
信息
- ID
- 4918
- 时间
- 3000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者
粤公网安备44195502000195号