#include #define cut(A) ((A)<(0) ? (-1) : (A)) int min = 1000000; int main(){ int N, K, i, j, k, d, new; int *a, *b; a = (int *) malloc(sizeof(int)*10000000); b = (int *) malloc(sizeof(int)*10000000); scanf("%d", &N); // nacita do N pocet test case-ov for (i = 0; i < N; i++){ // hlavny cyklus - pre kazdy test case scanf("%d", &K); // K = vyska mapy (pocet nasledujucich riadkov) for (j = 0; j < K; j++) scanf("%d %d", &a[j], &b[j]); // hladanie minima pre kazdy riadok for (j = 0; j < K; j++){ d = b[j] - a[j]; // 1.) priama sirka rieky na danom riadku // printf("Debug: riadok: %d, cesta: %d\n", j+1, d); // 2.) kym (pocet pripocitanych riadkov < aktualna dlzka) && (nie som na konci pola) for (k = 1; k <= d && j+k < K; k++){ // hladanie z praveho brehu if (b[j+k] <= b[j]) break; new = cut(b[j] - a[j+k]) + k; if (new < d) d = new; // ak dlzka pre novy riadok je mensia zapis ju // printf("Debug: right %d: %d\n", k, d); } for (k = 1; k <= d && j+k < K; k++){ // hladanie z laveho brehu if (a[j+k] >= a[j]) break; new = cut(b[j+k] - a[j]) + k; if (new < d) d = new; // rovnako z opacnej strany brehu // printf("Debug: left %d: %d\n", k, d); } if (d < min) min = d; } printf("K prechodu reky je treba %d pontonu.\n", min); min = 1000000; } return 0; }