洛谷 P1056 排座椅(貪心)

2021-09-26 04:40:57 字數 1655 閱讀 1454

貪心規律:不管是行還是列,優先輸出價值大(即能把交頭接耳同學盡可能多的分開)的序號。

使用結構體記錄序號mark和該號序的價值,分別輸入統計所有行序號和所有列序號的價值。

因此,只需對統計好的行結構體陣列、列結構體陣列按價值從大到小排序,分別取前k和前l個的位置座標即可,可以證明這是最優的思路。

要注意有坑。在找出我們需要的位置時,別忘了對位置再從小到大排個序輸出,不然wa聲一片。

#include

#include

#include

#include

#include

#include

#include

#include

#include

using namespace std;

typedef

long

long ll;

const

int mod =

10000007

;const

int inf =

0x3f3f3f3f

;const

double pi =

acos(-

1.0)

;const

int maxn =

1010

;struct noderow[maxn]

,col[maxn]

;int a[maxn]

,b[maxn]

;//按價值從大到小排序

intcmp

(node a, node b)

intmain()

int x,y,p,q;

for(

int i=

0;i)//按價值從大到小排序

sort

(row+

1,row+maxn,cmp)

;//直接輸出前k個序號會wa掉

//將前k個序號儲存一下按從小到大順序輸出

for(

int i=

1;i<=k;i++

) a[i]

= row[i]

.mark;

sort

(a+1

,a+k+1)

;for

(int i=

1;i<=k;i++

)printf

("\n");

//按價值從大到小排序

sort

(col+

1,col+maxn,cmp)

;//直接輸出前l個序號會wa掉

//將前l個序號儲存一下按從小到大順序輸出

for(

int i=

1;i<=l;i++

) b[i]

= col[i]

.mark;

sort

(b+1

,b+l+1)

;for

(int i=

1;i<=l;i++

)return0;

}

洛谷 P1056 排座椅

題目描述 上課的時候總會有一些同學和前後左右的人交頭接耳,這是令小學班主任十分頭疼的一件事情。不過,班主任小雪發現了一些有趣的現象,當同學們的座次確定下來之後,只有有限的d對同學上課時會交頭接耳。同學們在教室中坐成了m行n列,坐在第i行第j列的同學的位置是 i,j 為了方便同學們進出,在教室中設定了...

洛谷P1056 排座椅

上課的時候總會有一些同學和前後左右的人交頭接耳,這是令小學班主任十分頭疼的一件事情。不過,班主任小雪發現了一些有趣的現象,當同學們的座次確定下來之後,只有有限的d對同學上課時會交頭接耳。同學們在教室中坐成了m行n列,坐在第i行第j列的同學的位置是 i,j 為了方便同學們進出,在教室中設定了k條橫向的...

洛谷P1056 排座椅

先上題目鏈結 注釋寫得多,直接貼 了 include include include using namespace std intmain else if ay by for i 1 i k i 退出這個迴圈時p為分割最大的線的下標 horizontal tmp false 求出一條分割最多的線後...