上課的時候總會有一些同學和前後左右的人交頭接耳,這是令小學班主任十分頭疼的一件事情。不過,班主任小雪發現了一些有趣的現象,當同學們的座次確定下來之後,只有有限的d對同學上課時會交頭接耳。
同學們在教室中坐成了mm行nn列,坐在第i行第j列的同學的位置是(i,j)(i,j),為了方便同學們進出,在教室中設定了kk條橫向的通道,ll條縱向的通道。
於是,聰明的小雪想到了乙個辦法,或許可以減少上課時學生交頭接耳的問題:她打算重新擺放桌椅,改變同學們桌椅間通道的位置,因為如果一條通道隔開了22個會交頭接耳的同學,那麼他們就不會交頭接耳了。
請你幫忙給小雪編寫乙個程式,給出最好的通道劃分方案。在該方案下,上課時交頭接耳的學生的對數最少。
輸入格式:
第一行,有55個用空格隔開的整數,分別是m,n,k,l,d(2 \le n,m \le 1000,0 \le k接下來的dd行,每行有44個用空格隔開的整數。第ii行的44個整數x_i,y_i,p_i,q_ixi,yi,pi,qi,表示坐在位置(x_i,y_i)(xi,yi)與(p_i,q_i)(pi,qi)的兩個同學會交頭接耳(輸入保證他們前後相鄰或者左右相鄰)。
輸入資料保證最優方案的唯一性。
輸出格式:
共兩行。
第一行包含kk個整數a_1,a_2,…,a_ka1,a2,…,ak,表示第a_1a1行和a_1+1a1+1行之間、第a-2a−2行和a_2+1a2+1行之間、…、第a_kak行和第a_k+1ak+1行之間要開闢通道,其中a_i< a_i+1ai第二行包含ll個整數b_1,b_2,…,b_lb1,b2,…,bl,表示第b_1b1列和b_1+1b1+1列之間、第b_2b2列和b_2+1b2+1列之間、…、第b_lbl列和第b_l+1bl+1列之間要開闢通道,其中b_i< b_i+1bi輸入樣例#1:複製
4 5 1 2 3
4 2 4 3
2 3 3 3
2 5 2 4
輸出樣例#1:複製
上圖中用符號*、※、+標出了33對會交頭接耳的學生的位置,圖中33條粗線的位置表示通道,圖示的通道劃分方案是唯一的最佳方案。
2023年普及組第二題
錯誤**:
原因:自己想的太簡單了!!!
#include #include using namespace std;
int m, n, k, l, d; //d對同學交頭接耳,m行,n列.k條橫向通道,l條縱向通道
int x1[2000+10],y1[2000+10],x2[2000+10],y2[2000+10]; //交頭接耳的同學座標
int h[1000+10],lie[1000+10]; //需要開闢通道的行和列
bool vis_h[1000+10] = , vis_lie[1000+10] = ; //是否已被切過
int h_num = 0, lie_num= 0;
int main()
for(int i = 1; i <= d; i++)
}else
}} if(y1[i] == y2[i]) //行相同
}else
}} }
for(int i = 0; i < h_num; i++)
printf("\n");
for(int i = 0; i < lie_num; i++)
return 0;
}
別人的ac**:
思路:
#include#include#include#include#includeusing namespace std;
int m,n,k,l,d;//變數名最好起與題目一致的
int x[1005],y[1005];//橫縱座標陣列
int c[1005],o[1005];//桶排要用的陣列
int main()
for(int i=1; i<=k; i++) //開始桶排
}y[p]=0;//求出max之後一定要記得清零!!否則無論排多少次都是乙個答案
c[p]++;//桶排不解釋
} for(int i=1; i<=l; i++)
}x[p]=0; //同上
o[p]++;
} for(int i=0; i<1005; i++) //輸出答案
printf("\n");
for(int i=0; i<1005; i++)
return 0;
}
看了這位大佬的解答,順便學了新知識,桶排序!開心!
桶排序:
洛谷 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 求出一條分割最多的線後...