// zoltan chivay // marigold // triss #include #include //#include using namespace std; int min (int a, int b) { return a < b ? a : b; } void printPl(int * pL, int k) { for (int i = 0; i < k; i++) cout << pL[i] << " "; cout << endl; } bool zaStartem (int x, int y, int* pS) { if (x <= pS[y]) return false; return true; } bool zaCilem (int x, int y, int* pC) { if (x >= pC[y]) return true; return false; } int minNW (int y, int* pK, int* pL) { if (y == 0) return pK[y]; else return min (pK[y], pL[y-1]); } int minSC (int y, int k, int * pL) { if (y == k-1) return pL[y]; else return min(pL[y+1] + 1, pL[y]); } int main (int argc, char ** argv) { int n; cin >> n; for (int mustafa = 0; mustafa < n; mustafa++) { int k; cin >> k; int * pS = new int[k]; int * pC = new int[k]; int maxX = -1; for (int i = 0; i < k; i++) { cin >> pS[i]; cin >> pC[i]; if (pC[i] > maxX) maxX = pC[i]; } int minCost = 1000001; int * pK, * pL; pK = new int [k]; for (int y = 0; y < k; y++) pK[y] = 0; for (int x = 1; x <= maxX; x++) { pL = new int[k]; // prvni pruchod dolu for (int y = 0; y < k; y++) { if (! zaStartem(x, y, pS) ) pL[y] = 0; else { pL[y] = minNW (y, pK, pL) + 1; } } // druhy pruchod nahoru for (int y = k-1; y >= 0; y--) { if (pL[y] != 0) pL[y] = minSC (y, k, pL); if (zaCilem(x, y, pC) && pL[y] < minCost) minCost = pL[y]; } //printPl(pL, k); delete [] pK; pK = pL; } delete [] pK; delete [] pC; delete [] pS; cout << "K prechodu reky je treba " << minCost << " pontonu." << endl; } return 0; }