POJ 1548 - Robots
http://poj.org/problem?id=1548
概要
24 * 24 のグリッド上のいくつかのマスにはゴミがある. このゴミをロボットで回収したい.
ロボットは北西のマスからスタートし,東方向か南方向に進みつつゴミを回収し,最終的に南東のマスで終わる.
すべてのゴミを回収するのに必要な最小のロボットの数を答える.
制約
特になし
解法
ゴミが存在する最も北の列のゴミをすべて回収してから南に進む,という貪欲的な戦略が最適なので,これをシミュレーションして何回繰り返す必要があるか調べる.
poj/1548.cc1 #include <iostream> 2 #include <algorithm> 3 using namespace std; 4 5 int main() 6 { 7 int x, y; 8 while (cin >> x >> y && x != -1) { 9 static const int N = 24; 10 static bool grid[N][N]; 11 for (int i = 0; i < N; i++) { 12 fill_n(grid[i], N, false); 13 } 14 grid[x-1][y-1] = true; 15 int left = 1; 16 while (cin >> x >> y && x != 0) { 17 grid[x-1][y-1] = true; 18 ++left; 19 } 20 21 int ans = 0; 22 while (left > 0) { 23 ++ans; 24 for (int i = 0, j = 0; i < N;) { 25 bool *p = find(grid[i]+j, grid[i]+N, true); 26 if (p == grid[i]+N) { 27 ++i; 28 } else { 29 j = distance(grid[i], p); 30 *p = false; 31 --left; 32 } 33 } 34 } 35 cout << ans << endl; 36 } 37 return 0; 38 }