#include <algorithm> #include <stdio.h> #define MAXN 2048 #define K3DBG(X) int ile_na_wierzchu[MAXN][MAXN]; int roczniki[MAXN][MAXN]; int min_required_for_rocznik[MAXN]; int ile(int r, int i, int n) { if (r <= 0) { return 0; } if (i < 0) return 0; if (i >= n) return 0; return ile_na_wierzchu[r][i]; } void calculate(int n, int k) { ile_na_wierzchu[0][0] = 0; min_required_for_rocznik[roczniki[0][0]] = 1; for (int r=1; r < n; r++) { for (int i=0; i < r+1; i++) { int b1 = ile(r-1, i-1,n); int b2 = ile(r-1, i,n); int sameB = ile(r-2, i-1, n) + ((r>=2) ? 1 : 0); int ileNad = 1 + ((i>0 && i<r) ? 1 : 0); ile_na_wierzchu[r][i] = ileNad + b1 + b2 - ((b1 > 0 && b2 > 0) ? sameB : 0); K3DBG(printf("(%d, %d) b1=%d, b2=%d, sameB=%d, res=%d\n", r,i,b1,b2,sameB, ile_na_wierzchu[r][i])); int processedR = roczniki[r][i]; min_required_for_rocznik[processedR] = std::min(min_required_for_rocznik[processedR], ile_na_wierzchu[r][i] + 1); } K3DBG(printf("\n")); } } int main() { for (int i=0; i < MAXN; i++) { min_required_for_rocznik[i] = 1000000000; } int n,k; scanf("%d%d", &n, &k); for (int r=0; r < n; r++) { for (int i=0; i < r+1; i++) { scanf("%d", &roczniki[r][i]); } } calculate(n,k); for (int i=0; i < MAXN; i++) { if (min_required_for_rocznik[i] < 100000000) { K3DBG(printf("rocznik: %d required: %d\n", i, min_required_for_rocznik[i])); } if (min_required_for_rocznik[i] <= k) { printf("%d\n", i); break; } } return 0; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 | #include <algorithm> #include <stdio.h> #define MAXN 2048 #define K3DBG(X) int ile_na_wierzchu[MAXN][MAXN]; int roczniki[MAXN][MAXN]; int min_required_for_rocznik[MAXN]; int ile(int r, int i, int n) { if (r <= 0) { return 0; } if (i < 0) return 0; if (i >= n) return 0; return ile_na_wierzchu[r][i]; } void calculate(int n, int k) { ile_na_wierzchu[0][0] = 0; min_required_for_rocznik[roczniki[0][0]] = 1; for (int r=1; r < n; r++) { for (int i=0; i < r+1; i++) { int b1 = ile(r-1, i-1,n); int b2 = ile(r-1, i,n); int sameB = ile(r-2, i-1, n) + ((r>=2) ? 1 : 0); int ileNad = 1 + ((i>0 && i<r) ? 1 : 0); ile_na_wierzchu[r][i] = ileNad + b1 + b2 - ((b1 > 0 && b2 > 0) ? sameB : 0); K3DBG(printf("(%d, %d) b1=%d, b2=%d, sameB=%d, res=%d\n", r,i,b1,b2,sameB, ile_na_wierzchu[r][i])); int processedR = roczniki[r][i]; min_required_for_rocznik[processedR] = std::min(min_required_for_rocznik[processedR], ile_na_wierzchu[r][i] + 1); } K3DBG(printf("\n")); } } int main() { for (int i=0; i < MAXN; i++) { min_required_for_rocznik[i] = 1000000000; } int n,k; scanf("%d%d", &n, &k); for (int r=0; r < n; r++) { for (int i=0; i < r+1; i++) { scanf("%d", &roczniki[r][i]); } } calculate(n,k); for (int i=0; i < MAXN; i++) { if (min_required_for_rocznik[i] < 100000000) { K3DBG(printf("rocznik: %d required: %d\n", i, min_required_for_rocznik[i])); } if (min_required_for_rocznik[i] <= k) { printf("%d\n", i); break; } } return 0; } |