日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【NOIP普及组】2016模拟考试(10.29)——排座椅

發布時間:2024/4/14 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【NOIP普及组】2016模拟考试(10.29)——排座椅 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

問題 B: 排座椅(seat.cpp)

時間限制:?1 Sec??內存限制:?64 MB

題目描述

上課的時候總有一些同學和前后左右的人交頭接耳,這是令小學班主任十分頭疼的一件事情。不過,班主任小雪發現了一些有趣的現象,當同學們的座次確定下來之后,只有有限的D對同學上課時會交頭接耳。同學們在教室中坐成了M行N列,坐在第i行第j列的同學的位置是(i,j),為了方便同學們進出,在教室中設置了K條橫向的通道,L條縱向的通道。于是,聰明的小雪想到了一個辦法,或許可以減少上課時學生交頭接耳的問題:她打算重新擺放桌椅,改變同學們桌椅間通道的位置,因為如果一條通道隔開了兩個會交頭接耳的同學,那么他們就不會交頭接耳了。 請你幫忙給小雪編寫一個程序,給出最好的通道劃分方案。在該方案下,上課時交頭接耳的學生對數最少。

輸入

seat.in 第一行,有5各用空格隔開的整數,分別是M,N,K,L,D(2≤N,M≤1000,0≤K<M,0≤L<N,D≤2000)。 接下來D行,每行有4個用空格隔開的整數,第i行的4個整數Xi,Yi,Pi,Qi,表示坐在位置(Xi,Yi)與(Pi,Qi)的兩個同學會交頭接耳(輸入保證他們前后相鄰或者左右相鄰)。

輸出

seat.out 共兩行。 第一行包含K個整數,a1a2……aK,表示第a1行和a1+1行之間、第a2行和第a2+1行之間、…、第aK行和第aK+1行之間要開辟通道,其中ai<ai+1,每兩個整數之間用空格隔開(行尾沒有空格)。 第二行包含L個整數,b1b2……bk,表示第b1列和b1+1列之間、第b2列和第b2+1列之間、…、第bL列和第bL+1列之間要開辟通道,其中bi<bi+1,每兩個整數之間用空格隔開(行尾沒有空格)。

樣例輸入

4 5 1 2 3 4 2 4 3 2 3 3 3 2 5 2 4

樣例輸出

2 2 4

提示

?

上圖中用符號*、※、+ 標出了3對會交頭接耳的學生的位置,圖中3條粗線的位置表示通道,圖示的通道劃分方案是唯一的最佳方案。

#------------------------------------------------------------------------------#

這個題,看上去很像圖論,事實上是貪心……


大體思路:

輸入xi,yi,pi,qi,只要xi和pi相等,就表示兩個學生在同一排,則L[yi和qi中小的一個]++

如果yi和qi相等,就表示兩個學生在同一列,則K[xi和pi中小的一個]++,千萬不要弄反了。


為什么要小的一個++呢?

仔細觀察一下圖(題目也有說)就知道了,輸出的是ai與ai+1,如果存大的一個,通道就有問題了。


存的時候用結構體更方便,里面還需有一個a變量,存安放的位置,初始化a[i]均為i。

然后就是按K和L從大到小排序,注意還要再排一次a,因為題目說需從小到大輸出!


然后直接輸出即可。


代碼:

#include<cstdio> #include<algorithm> using namespace std; int m,n,k,l,d; struct node {int a,n; }x[1002],y[1002];//結構體 bool _c(node x,node y) {return x.n>y.n;//按n }//sort從大到小 bool c_(node x,node y) {return x.a<y.a;//按a }//sort從小到大 int main() {scanf("%d%d%d%d%d",&m,&n,&k,&l,&d);for(int i=1;i<=max(m,n);i++)x[i].a=y[i].a=i;//初始化for(int i=1;i<=d;i++){int _x,_y,_p,_q;scanf("%d%d%d%d",&_x,&_y,&_p,&_q);if(_y==_q) x[min(_x,_p)].n++;//在同一列if(_x==_p) y[min(_y,_q)].n++;//在同一行}sort(x+1,x+n+1,_c); sort(y+1,y+n+1,_c); sort(x+1,x+k+1,c_); sort(y+1,y+l+1,c_);//四次排序printf("%d",x[1].a);for(int i=2;i<=k;i++)printf(" %d",x[i].a);//輸出printf("\n%d",y[1].a);for(int i=2;i<=l;i++)printf(" %d",y[i].a);//一定要處理空格!!!我因為沒處理行末空格wrong了1次return 0; }

轉載于:https://www.cnblogs.com/LinqiongTaoist/p/7203756.html

總結

以上是生活随笔為你收集整理的【NOIP普及组】2016模拟考试(10.29)——排座椅的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。