VLPT12A spoj PTIT – Cơm hộp

Nguồn đề bài: http://www.spoj.com/PTIT/problems/VLPT12A/

1. Đề bài VLPT12A spoj

Một cửa hàng bán cơm hộp bằng cách nhận các đặt hàng qua điện thoại, sau đó sẽ giao cơm đến tận nơi. Để tăng hiệu quả kinh doanh, năm nay cửa hàng này quyết định tìm một địa điểm mới để giảm thiểu chi phí vận chuyển.

Giả sử thành phố được mô tả qua một lưới hình chữ nhật. Các địa điểm cần đến và cả cửa hàng đều là các điểm giao nhau trên lưới. Dựa trên thống kê trong năm trước, người quản lý cửa hàng biết được số yêu cầu đặt cơm trong năm. Chi phí vận chuyển từ cửa hàng đến điểm có yêu cầu được tính theo khoảng cách Manhattan, tức là tổng số đơn vị theo chiều dọc và chiều ngang tối thiểu cần đi qua trên lưới. Tất nhiên ta chỉ tính chi phí vận chuyển đến chứ không tính đoạn đường quay về.

Hãy viết chương trình xác định chi phí vận chuyển tối thiểu trong năm qua nếu đặt cửa hàng sang vị trí tối ưu nhất.

Input

Dòng 1 ghi số n là số bộ test (1<=n<=20).

Với mỗi bộ test, dòng đầu ghi hai số x,y là số cột và số dòng của lưới. 1<=x,y<=100.

y dòng tiếp theo, mỗi dòng ghi x giá trị cho biết số yêu cầu đặt cơm của mỗi điểm trong năm qua, các giá trị đều không quá 1000.

Output

Với mỗi bộ test, ghi ra màn hình một số nguyên duy nhất là chi phí vận chuyển tối thiểu trong năm qua khi đặt cửa hàng ở vị trí tối ưu.

Example

Input:
2

4 4

0 8 2 0

1 4 5 0

0 1 0 1

3 9 2 0

6 7

0 0 0 0 0 0

0 1 0 3 0 1

2 9 1 2 1 2

8 7 1 3 4 3

1 0 2 2 7 7

0 1 0 0 1 0

0 0 0 0 0 0
Output:
55
162

2. Gợi ý giải VLPT12A spoj PTIT

– Với thời gian đề cho là 10s, các bạn có thể dễ dàng giải bằng DPT N^4

3. Code tham khảo VLPT12A spoj PTIT

const   fi='';
        nmax=100;
type    data=longint;
var
        f:text;
        a:array[0..nmax+1,0..nmax+1] of data;
        n,x,y:data;

procedure xuli;
var     i,j,u,v:data;
        res,min:data;
begin
        min:=high(data);
        for i:=1 to x do
                for j:=1 to y do
                        begin
                                res:=0;
                                for u:=1 to x do
                                        for v:=1 to y do
                                             if (u<>i) or (v<>j) then
                                                res:=res+(abs(u-i)+abs(v-j))*a[u,v];
                                if res<min then
                                        min:=res;
                        end;
        writeln(min);
end;

procedure docfile;
var     i,j,k:data;
begin
        assign(f,fi); reset(f);
        read(f,n);
        for k:=1 to n do
                begin
                        read(f,y,x);
                        for i:=1 to x do
                                for j:=1 to y do
                                        read(f,a[i,j]);
                        xuli;
                end;
        close(f);
end;

begin
        docfile;
end.

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *