## 소감 ¶

 2005-12-29 Accepted 1.703 440

## 코드 ¶

```~cpp
// 10201 - Adventures in Moving: Part IV
#include <iostream>
using namespace std;

//#include <fstream>
//fstream cin("in.txt");

#define MAX_OIL 200
#define MAX_SIZE 101
#define MAX_NUM 1000000000

typedef struct
{
int length;
int price;
}Station;

static int totalLength;				/* 워털루에서 대도시까지의 거리 */
static int numStation;				/* 주유소 수 */
static Station station[MAX_SIZE];	/* 주유소 정보 */
static int d[2][MAX_OIL+1];			/* 다이나믹 테이블 */

inline
int getDistance(int i)
{
return station[i].length - station[i-1].length;
}

void input()
{
cin >> totalLength;
cin.get();
numStation = 0;
while (cin.peek() != EOF && cin.peek() != '\n')
{
numStation++;
cin >> station[numStation].length >> station[numStation].price;
cin.get();
}
cin.get();
}

void initTable()
{
station[0].length = 0;
for (int j = 0; j <= MAX_OIL; j++)
{
if (100 - station[1].length < 0 || j < 100 - station[1].length)
d[1][j] = MAX_NUM;
else
d[1][j] = (j - 100 + station[1].length) * station[1].price;
}
}

void process()
{
int min, cost;
int i, j, k;
initTable();

if (numStation == 1)
{
if (totalLength - station[numStation].length > 100 || station[1].length > 100)
cout << "Impossible\n";
else
cout << d[1][totalLength - station[numStation].length + 100] << endl;
return;
}

for (i = 2; i <= numStation; i++)
{
for (j = 0; j <= MAX_OIL; j++)
{
min = MAX_NUM;
for (k = 0; k <= MAX_OIL; k++)
{
if (k - getDistance(i) < 0 || d[(i-1)%2][k] >= MAX_NUM || j < k - getDistance(i))
continue;
cost = d[(i-1)%2][k] + (j - k + getDistance(i)) * station[i].price;
if (cost < min)
min = cost;
}
d[i%2][j] = min;
}
}

min = MAX_NUM;
for (j = 100; j <= MAX_OIL; j++)
{
if (d[numStation%2][j] < MAX_NUM && d[numStation%2][j] < min && j - (totalLength - station[numStation].length) >= 100)
min = d[numStation%2][j];
}
if (min >= MAX_NUM)
{
cout << "Impossible\n";
return;
}
cout << min << endl;
}

int main()
{
int numCase;
cin >> numCase;
cin.get(), cin.get();
for (int i = 0; i < numCase; i++)
{
input();
process();
if (i != numCase - 1)
cout << endl;
}
return 0;
}
```