JZOJ 1115. 排座椅(seat)
题目描述

输入

输出

样例输入
4 5 1 2 34 2 4 32 3 3 32 5 2 4
样例输出
22 4
提示
【输入输出样例解释】

上图中用符号*、※、+ 标出了3对会交头接耳的学生的位置,图中3条粗线的位置表示通道,图示的通道划分方案是唯一的最佳方案。
分析
这一道题基本掌握了这个技巧直接秒杀,根本不在话下
第一行的输入不用说了,但是在第2到d+1行有一个技巧
我们不需要直接把这个数据存入,因为题目所说他们必定相
挨在一起,此时,我们只需要使用变量ABCD存下,
然后判断:如果他们是一行的,分割列的价值就加上一
否则(他们是一列的) 那么分割这个空位的价值就加1
最后只要权值最大的K 位横向, L位竖向的排序输出就可以了
- 记得,一定要排序输出,不然见十八代祖宗
代码
#include using namespace std;int m,n,k,l,d;int h[1010],line[1010]; // 权值圈bool vish[1010],visl[1010]; // 找前k,l位大的权值是需要的标记数组int t[1010],t2[1010]; // 使用桶排将数据排序输出int min(int a,int b){return a>b?b:a;}int main(){freopen("seat.in","r",stdin);freopen("seat.out","w",stdout);//m->h n->lscanf("%d%d%d%d%d",&m,&n,&k,&l,&d);for(int i = 1;i <= d;i++){int a,b,c,d;scanf("%d%d%d%d",&a,&b,&c,&d);if(a == c) // 利用题目的性质 : 使用变量ABCD存下line[min(b,d)]++; // 果他们是一行的,分割列的价值就加上一else //否则(他们是一列的) 那么分割这个空位的价值就加1h[min(a,c)]++;}while(k--) // 找前k大的权值并把他们进行桶排{int maxx=0,index=0;for(int i = 1;i <= m;i++){if(vish[i]==0&&maxx
本人的代码显得有些累赘,有心人可以把他优化一下。QVQ
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
