掃地機械人(第十屆藍橋杯研究生組)

2021-09-13 13:52:12 字數 2779 閱讀 8969

如圖,在一塊長為n的方格地板上,放置k個掃地機械人(圖中黑點),每個機械人都可以左右移動,且互不干擾,掃完地後又都回到原位置,為公平起見,每個機械人的工作量盡可能相同,求移動步數最多的機械人移動的步數。(題目大概是這個意思,歡迎來更正)

輸入格式:

第一行輸入兩個整數:n、k

第二行輸入k個整數,表示掃地機械人的位置

輸出格式:

輸出乙個整數,表示移動步數最多的機械人移動的步數

案例:

輸入:10 3

3 5 8

輸出:6

說明:總移動步數最少的方案為:

1號機械人路線:3->2->1->2->3->4->3

2號機械人路線:5->6->7->6->5

3號機械人路線:8->9->10->9->8

演算法思想

假設每個機械人的位置為a[i],對應掃地區間為[xi,yi](i=1,2,…,k),顯然x1<=a[i]<=yi。於是,問題轉化為:尋找一組區間(k個),在區間長度盡可能一致的情況下,使這組區間能夠覆蓋滿1~n,並且每個區間內至少有乙個機械人(否則至少有乙個區間內沒有機械人,即該區間沒有機械人掃,無意義)。設最長的區間長度為l,則移動步數最多的機械人移動了2*(l-1)步。

在不影響最長區間長度的情況下,為方便計算,不妨設每個區間的長度都為l。顯然,n/k<=l<=n。為方便讀者理解筆者思路,下面給出幾個特例圖。

演算法步驟

說明:

之所以要改變第1個區間的長度,因為會出現如下情況:

當區間長度l=6時,系統會誤判區間長度不夠。實際上,l=6夠了,如下:

之所以只改變第1個區間的長度,因為區間之間是緊挨著的,縮小第1個區間的長度,後面的區間都會向左平移,其實第1個區間也向左平移了,只是前一部分越界了沒顯示。

演算法實現

#include#includeusing namespace std;

int n,k;

int a[100]; //k個機械人位置

int b[100]; //標記n個方格中是否有機械人

演算法思想的正確性還有待考證,歡迎熱心的讀者批評指正!

演算法思想

如果每個機械人的活動區間確定了,其最大的移動步數可根據2*(l-1)求得。為減輕每個機械人的任務,限制相鄰的機械人的活動範圍不相交。

第1個機械人的活動範圍:1~a[2]-1,其右邊界活動範圍:a[1] ~ a[2]-1;

第2個機械人的活動範圍:a[1]+1~a[3]-1,其右邊界活動範圍:a[2] ~ a[3]-1;

第3個機械人的活動範圍:a[2]+1~a[4]-1,其右邊界活動範圍:a[3] ~ a[4]-1;

…第k-1個機械人的活動範圍:a[k-2]+1~a[k]-1,其右邊界活動範圍:a[k-1] ~ a[k]-1;

第k個機械人的活動範圍:a[k-1]+1~n,其右邊界活動範圍:n ~ n;

第1個機械人的左邊界已確定,如果其右邊界確定了,第二個機械人的左邊界就確定了,即後面的機械人的左邊界依賴於前面機械人的右邊界,由此可用dfs對每個機械人的右邊界的所有情況進行遍歷,每找到一種區間劃分法,檢驗是否優於當前解

演算法實現

#include#include#define inf 10000000 

using namespace std;

struct neighbor;

int n,k;

int a[100]; //k個機械人位置

neighbor b[100]; //k個機械人的最大移動鄰域

neighbor f[100]; //k個機械人的移動鄰域

int min_max_l=inf; //最小的最大鄰域長度

void init()

sort(a+1,a+k+1);

b[1].l=1;

b[k].r=n;

if(k==1)else

for(i=2;im)

} return m;

}void search(int index,int left)

return;

} for(i=a[index];i<=b[index].r;i++)

} int main()

第十屆藍橋杯 掃地機械人

問題描述 小明公司的辦公區有一條長長的走廊,由 n 個方格區域組成,如下圖所示。走廊內部署了 k 臺掃地機械人,其中第 i 臺在第 ai 個方格區域中。已知掃地機械人每分鐘可以移動到左右相鄰的方格中,並將該區域清掃乾淨。請你編寫乙個程式,計算每台機械人的清掃路線,使得 它們最終都返回出發方格,每個方...

藍橋杯 掃地機械人

小明公司的辦公區有一條長長的走廊,由 nn 個方格區域組成,如下圖所示。走廊內部署了 kk 臺掃地機械人,其中第 ii 臺在第 a ia i個方格區域中。已知掃地機械人每分鐘可以移動到左右相鄰的方格中,並將該區域清掃乾淨。請你編寫乙個程式,計算每台機械人的清掃路線,使得它們最終都返回出發方格,每個方...

第十屆藍橋杯c組

求和 1905111 這裡的string npos可以使用 1代替 include include using namespace std intmain cout 矩形切割 21 include include using namespace std intmain cout 年號字元 byq i...