生活随笔
收集整理的這篇文章主要介紹了
P1056 排座椅(模拟)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目描述
上課的時候總會有一些同學和前后左右的人交頭接耳,這是令小學班主任十分頭疼的一件事情。不過,班主任小雪發現了一些有趣的現象,當同學們的座次確定下來之后,只有有限的D對同學上課時會交頭接耳。
同學們在教室中坐成了MM行NN列,坐在第i行第j列的同學的位置是(i,j)(i,j),為了方便同學們進出,在教室中設置了KK條橫向的通道,LL條縱向的通道。
于是,聰明的小雪想到了一個辦法,或許可以減少上課時學生交頭接耳的問題:她打算重新擺放桌椅,改變同學們桌椅間通道的位置,因為如果一條通道隔開了22個會交頭接耳的同學,那么他們就不會交頭接耳了。
請你幫忙給小雪編寫一個程序,給出最好的通道劃分方案。在該方案下,上課時交頭接耳的學生的對數最少。
輸入輸出格式
輸入輸出樣例
輸入樣例#1:
4 5 1 2 3
4 2 4 3
2 3 3 3
2 5 2 4
輸出樣例#1:
2
2 4
上圖中用符號*、※、+標出了33對會交頭接耳的學生的位置,圖中33條粗線的位置表示通道,圖示的通道劃分方案是唯一的最佳方案。
2008年普及組第二題
/*
這題我Wrong了好幾次,原因是我沒有考慮清楚,只寫了一個cmp:
bool
cmp(stu x
,stu y
)
{if(x
.num
== y
.num
)return x
.ans
< y
.ans
;return x
.num
> y
.num
;
}
只寫一個cmp是不夠的,因為輸出是按序號從小到大排序的,按我上面的寫法只保證了num大的序號在前面,不一定此時ans是小的,不能保證ans從小到大輸出!!!
正確寫法,需要些兩個cmp:
bool
cmp(stu x
,stu y
)
{return x
.num
> y
.num
;
}
bool
cmp1(stu x
,stu y
)
{return x
.ans
< y
.ans
;
}
*/
AC_code:
#include <iostream>
#include <algorithm>
using namespace std
;
struct stu
{int ans
;int num
;
} a
[1005],b
[1005];
bool
cmp(stu x
,stu y
)
{return x
.num
> y
.num
;
}
bool
cmp1(stu x
,stu y
)
{return x
.ans
< y
.ans
;
}
int main()
{int M
,N
,K
,L
,D
;cin
>>M
>>N
>>K
>>L
>>D
;int x
,y
,p
,q
,aim
;for(int i
= 1; i
<= D
; i
++){cin
>>x
>>y
>>p
>>q
;if(x
== p
){aim
= min(y
,q
);a
[aim
].num
++;a
[aim
].ans
= aim
;}else{aim
= min(x
,p
);b
[aim
].num
++;b
[aim
].ans
= aim
;}}if(K
){sort(b
,b
+M
,cmp
);sort(b
,b
+K
,cmp1
);cout
<<b
[0].ans
;for(int i
= 1; i
< K
; i
++){cout
<<" "<<b
[i
].ans
;}cout
<<endl
;}if(L
){sort(a
,a
+N
,cmp
);sort(a
,a
+L
,cmp1
);cout
<<a
[0].ans
;for(int i
= 1; i
< L
; i
++){cout
<<" "<<a
[i
].ans
;}cout
<<endl
;}return 0;
}
總結
以上是生活随笔為你收集整理的P1056 排座椅(模拟)的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。