如圖,在一塊長為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...