原题链接:排座椅[NOIP2008 年普及组]
解题思路:贪心策略, 分隔最多同学对数倒序排列, 选取前k(l)个加入vector, 然后以Idx排序输出
注意事项:
参考代码:
#include<bits/stdc++.h> using namespace std; const int N = 2e3 + 10; struct node{ int cnt, idx; }x[N], y[N]; int m, n, k, l, d, xx, yy, x2, y2; bool cmp(node a, node b) { if(a.cnt == b.cnt) return a.idx < b.idx; return a.cnt > b.cnt; } bool cmp1(node a, node b){ if(a.idx == b.idx) return a.cnt > b.cnt; return a.idx < b.idx; } vector<node> resx, resy; int main() { cin >> m >> n >> k >> l >> d; for(int i = 0; i < d; ++ i){ cin >> xx >> yy >> x2 >> y2; if(xx == x2 ) { y[min(yy, y2)].cnt ++; y[min(yy, y2)].idx = min(yy, y2); } else { x[min(xx, x2)].cnt ++; x[min(xx, x2)].idx = min(xx, x2); } } sort(x,x + m + 1, cmp); sort(y,y + n + 1, cmp); for(int i = 0; i < k; ++ i) resx.push_back(x[i]); for(int i = 0; i < l; ++ i) resy.push_back(y[i]); sort(resx.begin(),resx.end(), cmp1); sort(resy.begin(),resy.end(), cmp1); for(auto i:resx) cout << i.idx << ' '; cout << endl; for(auto i:resy) cout << i.idx << ' '; return 0; }
0.0分
0 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复