~cpp
// 10201 - Adventures in Moving: Part IV
#include <iostream>
using namespace std;
#define MAX_OIL 200
#define MAX_SIZE 103
#define MAX_NUM 1000000000
typedef struct
{
int length;
int price;
}Station;
static int totalLength; /* 워털루에서 대도시까지의 거리 */
static int numStation; /* 주유소 수 */
static Station station[MAX_SIZE]; /* 주유소 정보 */
inline
int getDistance(int i)
{
return station[i].length - station[i-1].length;
}
void input()
{
cin >> totalLength;
totalLength += 100;
cin.get();
numStation = 1;
station[numStation].length = 0;
station[numStation].price = 0;
while (cin.peek() != EOF && cin.peek() != '\n')
{
numStation++;
cin >> station[numStation].length >> station[numStation].price;
cin.get();
}
cin.get();
numStation++;
station[numStation].length = totalLength;
station[numStation].price = 0;
}
void process()
{
int maxmin, maxminprice , now = 1, tank = 100, go = 100, search = 2, cost = 0;
while(now != numStation)
{
maxmin = 0;
maxminprice = 1000000;
while(station[now].length + go >= station[search].length)
{
// 서치의 가격이 작거나 같을때
if(station[now].price > station[search].price)
{
if(station[search].length - station[now].length >= tank)
{
cost += (station[search].length - station[now].length - tank)*station[now].price;
tank = 0;
}
else
tank = tank - station[search].length + station[now].length;
now = search++;
maxmin = 0;
break;
}
// 서치의 가격이 클때
else
{
if(maxminprice > station[search].price)
{
maxmin = search;
maxminprice = station[search].price;
}
search++;
}
}
// 작은게 없을때
if(now + 1 == search && station[now].length + go < station[search].length)
{
cout << "Impossible\n";
return;
}
if(maxmin)
{
if(station[maxmin].length - station[now].length >= tank)
{
cost += (200 - tank)*station[now].price;
tank = go - station[maxmin].length + station[now].length;
}
else
tank = tank - station[maxmin].length + station[now].length;
now = maxmin;
search = now +1;
}
go = 200;
}
cout << cost << 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;
}