Niestety, nie byliśmy w stanie w pełni poprawnie wyświetlić tego pliku, ponieważ nie jest zakodowany w UTF-8.
Możesz pobrać ten plik i spróbować otworzyć go samodzielnie.
#include <cstdio> int z[1000005]; int main(){ int n,t; bool debug = false; scanf(" %d",&t); while(t--){ bool ciagly = true; int pocz = -1, kon = -1; scanf("%d",&n); for(int i=0; i<n; i++){ scanf("%d",&z[i]); if( kon >= 0 && z[i] > 0 && z[i-1] == 0 ) ciagly = false; if( pocz >= 0 && z[i]>0 ) kon = i; if( pocz<0 && z[i]>0 ) { pocz = i; kon = i; } } //sprawdz czy wogole byly jakies wyliczanki, albo czy moze wskazano na jedn� zabawke if(pocz == kon){ if(pocz == -1) printf("NIE\n"); else if (z[pocz] == 1) printf("TAK\n"); else printf("NIE\n"); //zobacz czy nie ma dwoch rozlacznych ciagow } else if(!ciagly){ printf("NIE\n"); //przypadek gdy wyliczane sa tylko dwie zabawki } else if(pocz == kon-1){ if( (z[pocz] - z[kon] >= -1 ) && (z[pocz] - z[kon] <= 1 ) ) printf("TAK\n"); else printf("NIE\n"); //przypadek gdy jest wyliczanych wiecej niz trzy } else { //jesli zabawki z brzegow maja wartosc wieksza to tak sie nie da if(( z[pocz] > z[pocz+1] ) || ( z[kon] > z[kon-1] )){ printf("NIE\n"); continue; } //jesli sa tylko 3 to moze sie zawijac do srodka (na srodku zaczyna i konczy) if(kon-pocz==2){ if( (z[pocz+1]>z[pocz] )&&(z[pocz+1]>z[pocz+2]) ){ if ((z[pocz+1] >= (z[pocz] + z[pocz+2]) - 1 )&&(z[pocz+1] <= (z[pocz] + z[pocz+2]) + 1 )){ printf("TAK\n"); continue; } else { printf("NIE\n"); continue; } } } /* //jesli jest ciag jedynek z lewej i prawej strony if(kon-pocz>=4){ //printf("test %d %d %d %d",z[pocz+1] , z[pocz+2] , z[pocz+4] , z[pocz+5]); bool zly = false; for(int i=pocz; i<=kon-3; i++) if(( z[i] + z[i+2] + z[i+3] == 3)&&(z[i+1]>1)){ printf("NIE\n"); zly = true; break; } if(zly) continue; }*/ //tak samo sie nie da jesli wyliczanka zawija sie do srodka przy sasiednich dwoch a jest wiecej niz 3 if(kon-pocz>=2){ if(( z[pocz+1] > (z[pocz] + z[pocz+2]) ) || ( z[kon-1] > (z[kon] + z[kon-2]))){ printf("NIE\n"); continue; } } // bool razOdjete=false; if(debug) printf("p:%d k:%d ",pocz,kon); for(int i=pocz; i<kon; i++){ //obadaj czyz to aby nie jest waskie gardlo (przynajmniej 4 pola do przodu) if(( kon-i >= 4 ) ){ /* //sprawdz czy nie zaczynac wyliczania od drugiego elementu od lewej if( (i == pocz) && (!razOdjete) && (z[i] < z[i+1])){ z[i+1]--; i--; razOdjete = true; continue; } */ if((z[i+1]==1)&&( z[i+1] < z[i+2] )&&( z[i+3] < z[i+2] )){ printf("NIE\n"); break; } //if(z[i]==1 && z[i+1] ==1 && i<kon-1) // continue; } //odejmij roznice ruchow z nastepnego pola od pola poprzedniego (ilosc odwiedzanych kierunkow) z[i+1] -= z[i]; //przypadek brzegowy if( i == kon-1 ) { if((z[i+1] == 0) || (z[i+1] == -1) || (z[i+1] == 1)) printf("TAK\n"); else printf("NIE\n"); break; } //nie da sie isc wiecej razy w lewa strone niz w prawa if(z[i+1] < 0){ printf("NIE\n"); 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 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 | #include <cstdio> int z[1000005]; int main(){ int n,t; bool debug = false; scanf(" %d",&t); while(t--){ bool ciagly = true; int pocz = -1, kon = -1; scanf("%d",&n); for(int i=0; i<n; i++){ scanf("%d",&z[i]); if( kon >= 0 && z[i] > 0 && z[i-1] == 0 ) ciagly = false; if( pocz >= 0 && z[i]>0 ) kon = i; if( pocz<0 && z[i]>0 ) { pocz = i; kon = i; } } //sprawdz czy wogole byly jakies wyliczanki, albo czy moze wskazano na jedn� zabawke if(pocz == kon){ if(pocz == -1) printf("NIE\n"); else if (z[pocz] == 1) printf("TAK\n"); else printf("NIE\n"); //zobacz czy nie ma dwoch rozlacznych ciagow } else if(!ciagly){ printf("NIE\n"); //przypadek gdy wyliczane sa tylko dwie zabawki } else if(pocz == kon-1){ if( (z[pocz] - z[kon] >= -1 ) && (z[pocz] - z[kon] <= 1 ) ) printf("TAK\n"); else printf("NIE\n"); //przypadek gdy jest wyliczanych wiecej niz trzy } else { //jesli zabawki z brzegow maja wartosc wieksza to tak sie nie da if(( z[pocz] > z[pocz+1] ) || ( z[kon] > z[kon-1] )){ printf("NIE\n"); continue; } //jesli sa tylko 3 to moze sie zawijac do srodka (na srodku zaczyna i konczy) if(kon-pocz==2){ if( (z[pocz+1]>z[pocz] )&&(z[pocz+1]>z[pocz+2]) ){ if ((z[pocz+1] >= (z[pocz] + z[pocz+2]) - 1 )&&(z[pocz+1] <= (z[pocz] + z[pocz+2]) + 1 )){ printf("TAK\n"); continue; } else { printf("NIE\n"); continue; } } } /* //jesli jest ciag jedynek z lewej i prawej strony if(kon-pocz>=4){ //printf("test %d %d %d %d",z[pocz+1] , z[pocz+2] , z[pocz+4] , z[pocz+5]); bool zly = false; for(int i=pocz; i<=kon-3; i++) if(( z[i] + z[i+2] + z[i+3] == 3)&&(z[i+1]>1)){ printf("NIE\n"); zly = true; break; } if(zly) continue; }*/ //tak samo sie nie da jesli wyliczanka zawija sie do srodka przy sasiednich dwoch a jest wiecej niz 3 if(kon-pocz>=2){ if(( z[pocz+1] > (z[pocz] + z[pocz+2]) ) || ( z[kon-1] > (z[kon] + z[kon-2]))){ printf("NIE\n"); continue; } } // bool razOdjete=false; if(debug) printf("p:%d k:%d ",pocz,kon); for(int i=pocz; i<kon; i++){ //obadaj czyz to aby nie jest waskie gardlo (przynajmniej 4 pola do przodu) if(( kon-i >= 4 ) ){ /* //sprawdz czy nie zaczynac wyliczania od drugiego elementu od lewej if( (i == pocz) && (!razOdjete) && (z[i] < z[i+1])){ z[i+1]--; i--; razOdjete = true; continue; } */ if((z[i+1]==1)&&( z[i+1] < z[i+2] )&&( z[i+3] < z[i+2] )){ printf("NIE\n"); break; } //if(z[i]==1 && z[i+1] ==1 && i<kon-1) // continue; } //odejmij roznice ruchow z nastepnego pola od pola poprzedniego (ilosc odwiedzanych kierunkow) z[i+1] -= z[i]; //przypadek brzegowy if( i == kon-1 ) { if((z[i+1] == 0) || (z[i+1] == -1) || (z[i+1] == 1)) printf("TAK\n"); else printf("NIE\n"); break; } //nie da sie isc wiecej razy w lewa strone niz w prawa if(z[i+1] < 0){ printf("NIE\n"); break; } } } } return 0; } |