İki göstərici texnikası
İki göstərici texnikası, kompüter elmləri və proqramlaşdırmada, massivlər və ya ardıcıllıqlar ilə bağlı problemlərin həlli üçün geniş istifadə olunan bir strategiyadır. Bu, massiv və ya ardıcıllığı müxtəlif mövqelərdən keçən iki göstəricinin istifadəsini əhatə edir, tez-tez əks istiqamətlərdə və ya fərqli sürətlə hərəkət edirlər. Bu texnika, axtarış, optimallaşdırma və ya massivlərin səmərəli şəkildə manipulyasiyası ilə bağlı problemlərin həllində xüsusilə faydalıdır.
İki göstərici texnikasının necə işlədiyinə dair bir qısa izah:
Başlanğıc: İlk olaraq, iki göstərici, adətən, massiv və ya ardıcıllığın müxtəlif mövqelərində yerləşdirirsiniz.
Hərəkət: Göstəriciləri müəyyən şərtlərə əsasən iterativ olaraq hərəkət etdirirsiniz, ta ki, onlar görüşənə qədər və ya müəyyən bir şərtə çatana qədər. Göstəricilərin hərəkəti problem tələblərinə əsasən idarə oluna bilər. Məsələn, bir göstərici digərlərinə nisbətən daha sürətlə hərəkət edə bilər, ya da onlar əks istiqamətlərdə hərəkət edə bilərlər.
Şərtin yoxlanması: Hər iterasiya addımında, problem tələblərinə əsaslanan müəyyən şərtləri yoxlayırsınız. Bu şərtlər tez-tez göstəriciləri hərəkət etdirmək, bəzi dəyişənləri yeniləmək və ya digər əməliyyatları həyata keçirmək üçün qərar verir.
Tamamlanma: Bu proses, bir və ya iki göstərici massiv və ya ardıcıllığın sonuna çatana qədər davam edir, ya da başqa bir tamamlanma şərti yerinə yetirilənə qədər davam edir.
İki göstərici texnikası, xüsusi meyarlara uyğun olan cütləri və ya alt massivləri axtarma, optimal həll yollarını tapma və ya ardıcıllıqları səmərəli şəkildə manipulyasiya etməklə bağlı problemlərdə xüsusilə faydalıdır, iç içə döngələrdən istifadə etmədən. Bu, xeyli vaxt sərf etmədən, düz xətti və ya logaritmik zaman mürəkkəblik tələbləri olan problemlər üçün genellikle daha səmərəli bir həll təqdim edir.
Rəqəmləri xətti massivdə saxlayın. Sonra onları tərs qaydada çap edin.
İki göstərici texnikası ilə massivini tərs çevirmək üçün bir həll düşünək.
İki dəyişəni və (onları göstəricilər adlandıracağıq) təyin edin:
massivinin əvvəlində ;
massivinin sonunda ;
Sonra bir while döngüsü başlayın, burada:
və dəyərləri dəyişdirilir;
sonra 1 artırılır, isə 1 azaldılır;
Göstəricilər və görüşənə qədər döngünü davam etdirin.
Qeyd edək ki, və dəyərlərini əlavə bir dəyişən ilə dəyişdirmək üçün üç əməliyyat aparılır:
Bir massiv elan edin.
#define MAX 110 int m[MAX];
Giriş məlumatlarını oxuyun.
scanf("%d",&n); for(i = 1; i <= n; i++) scanf("%d",&m[i]);
İki göstərici ilə massivini tərs çevirin.
i = 1; j = n; while(i < j) { temp = m[i]; m[i] = m[j]; m[j] = temp; i++; j--; }
Rəqəmləri çap edin.
for(i = 1; i <= n; i++) printf("%d ",m[i]); printf("\n");
Hüseyn və Yaroslav bir kart oyunu oynayır. Masanın üstündə ardıcıl düzülmüş kart var, hər birinin üzərində fərqli bir rəqəm yazılıb. Oyunçular növbə ilə oynayırlar. Hüseyn oyuna başlayır. Hər dövrdə oyunçu ya sol kənar, ya da sağ kənar kartı ala bilər. Oyunçu həmişə ən yüksək rəqəmi olan kartı seçəcək. Oyun, masada kart qalmadıqda sona çatır. Oyun sonunda Hüseyn və Yaroslavın topladığı kartların rəqəmlərinin cəmini tapın.
Giriş. İlk sətirdə masada kartın sayı var. İkinci sətirdə müsbət tam ədəd var, hər biri kartın üzərindəki rəqəmi göstərir. Bütün ədədlər -dan böyük deyil.
Çıxış. Oyun sonunda Hüseyn və Yaroslavın topladığı kartların rəqəmlərinin cəmini çap edin.
7 4 7 5 1 12 8 2
18 21
Gəlin massivində kartların üzərindəki ədədləri saxlayaraq düşünək. Göstəricilər massivinin əvvəlində və massivinin sonunda başlayır.
Hər dövrdə, oyunçu maksimum dəyəri olan kartı götürür, bundan sonra kart masadan çıxarılır (əgər kartı seçilirsə, əməlini yerinə yetirin, kartı seçilirsə, əməlini yerinə yetirin). Hər bir oyunçu seçilən kartların cəmini iki dəyişəndə saxlayır. Proses, bütün kartlar masadan çıxarılana qədər davam edir, yəni göstəricilər və görüşənə qədər.
Nümunə
Oyun aşağıdakı kimi davam edəcək.
Massivləri elan edin. Hüseyn və Yaroslavın topladığı kartların sayı və -də saxlanılacaq.
int m[10001], res[2];
Giriş məlumatlarını oxuyun.
scanf("%d", &n); for (i = 0; i < n; i++) scanf("%d", &m[i]);
Göstəriciləri və təyin edin.
i = 0; j = n - 1;
Oyunçular növbə ilə, toplam addım atırlar. Hüseyn cüt üçün növbəyə girir, Yaroslav isə tək üçün. Buna görə, Hüseynin cəmi -da, Yaroslavın cəmi isə -də toplanacaq.
for (k = 0; k < n; k++) {
Hər dövrdə, oyunçu maksimum dəyəri olan kartı seçir.
if (m[i] > m[j]) res[k % 2] += m[i++]; else res[k % 2] += m[j--]; ; }
Cavabı çap edin.
printf("%d %d\n", res[0], res[1]);
Hüseyn kartı bir sıra düzülərək ilə düzür. Sonra onları toplayır və başqa bir ardıcıllıqla düzür: . Bu, Yaroslava verdiyi ardıcıllıqdır. Sizin işiniz, Yaroslavanın Hüseynin orijinal ardıcıllığını bərpa etməsinə kömək etməkdir.
Məsələn, əgər Yaroslava ardıcıllığı verilibsə, o zaman o, Hüseyinə ardıcıllığını qaytarmalıdır.
Giriş. İlk sətirdə bir tam ədəd var, kartların sayı. İkinci sətirdə müsbət tam ədəd var, kartların üzərindəki ədədlər. Bütün ədədlər -dan böyük deyil.
Çıxış. Hüseynin orijinal ardıcıllığını çap edin.
6 2 4 9 4 7 6
2 6 4 7 9 4
7 5 7 34 1 89 4 2
5 2 7 4 34 89 1
Gəlin massivində kartların üzərindəki ədədləri saxlayaraq düşünək. İki göstəricini massivinin əvvəlində və massivinin sonunda təyin edin.
Orijinal ardıcıllığı bərpa etmək üçün, bütün elementlər işlənənə qədər soldan və sağdan kartları növbə ilə alın. Hər seçki ilə müvafiq göstərici öz mövqeyini dəyişir: sağa, isə sola hərəkət edir.
Nümunə
Gəlin bir neçə addımı ilk test nümunəsindən istifadə edərək araşdıraq.
Bir massiv elan edin.
int a[100001];
Giriş məlumatlarını oxuyun.
scanf("%d", &n); for (i = 0; i < n; i++) scanf("%d", &a[i]);
Göstəriciləri və təyin edin.
i = 0; j = n - 1;
bərabərsizliyi mövcud olduqda, növbə ilə və -ı çap edin, eyni zamanda göstəriciləri hərəkət etdirin.
while (i <= j) { printf("%d ", a[i++]); if (i > j) break; printf("%d ", a[j--]); }
Hüseynin və simvollarından ibarət bir stringi var. Özünü əyləndirmək üçün, o aşağıdakı oyunu düzəldib. Hüseyn stringə iki əməliyyatdan birini həyata keçirə bilər:
Sol ucuna , sağ ucuna əlavə etmək;
Sağ ucuna , sol ucuna əlavə etmək;
Məsələn, stringindən Hüseyn və ya ala bilər.
Siz, Hüseyinin bütün əməliyyatlardan sonra əldə etdiyi stringi verirsiniz (ola bilsin ki, o, heç bir əməliyyat etməyib). Stringin əvvəllər mümkün olan ən kiçik uzunluğunu təyin edin.
Giriş. Uzunluğu -dan çox olmayan, yalnız və simvollarından ibarət bir string verilir.
Çıxış. Hüseyinin əvvəlki stringinin mümkün olan ən kiçik uzunluğunu çap edin.
01010010
8
1001110
1
Gəlin giriş stringini nəzərdən keçirək — Huseyn bütün əməliyyatları etdikdən sonra əldə edilən string. İki göstəricini: stringin başında və sonunda təyin edək.
Əgər olarsa, deməli, stringin sonundakı simvollar müxtəlifdir: ya solda və sağda , ya da solda və sağda . Bu, əvvəlki stringin -dan genişləndirilə biləcəyini bildirir. Bu halda, hər iki göstəricini bir mövqe içəriyə doğru hərəkət etdirib -nin Huseynin əməliyyatları ilə əldə olunub-olunmadığını yenidən yoxlayın.
Halbuki, cari substringi olana qədər bu əməliyyatdan davam edə bilməz. Uzunluğunu çap edin — bu, Huseynin saxladığı orijinal stringdir.
Nümunə
Hüseynin əməliyyatlarını əks etdirək.
String idi, bu da Huseynin əvvəlki stringidir.
Giriş stringini oxuyun və onun uzunluğunu hesablayın, dəyişənində saxlayın.
cin >> s; res = s.size();
İki göstəricini stringin başlanğıcında və stringin sonunda təyin edin.
i = 0; j = s.size() - 1;
Əgər olarsa, deməli, stringin sonundakı simvollar müxtəlifdir. Huseyn, substring -ni substring -dən almış ola bilər.
while ((i < j) && (s[i] != s[j])) {
Hər iki göstəricini bir mövqe içəriyə doğru hərəkət etdirin və cari uzunluğunu azaldın.
i++; j--; res -= 2; }
Cavabı çap edin.
cout << res << endl;
Verilmiş massiv , artan sırada düzülmüş tam ədəd var. -ə bərabər olan cütünün olub olmadığını müəyyən edin, burada .
Giriş. İlk sətirdə iki tam ədəd və var. İkinci sətirdə müsbət tam ədəd var, hər biri -dan böyük deyil.
Çıxış. Əgər belə bir cüt varsa "BƏLİ" yazın, əks halda "YOX" yazın.
10 13 1 3 5 6 8 10 11 11 11 16
BƏLİ
8 61 5 5 8 12 16 21 44 50
YOX
Gəlin giriş ədədləri massivini nəzərdən keçirək. İki göstəricini massivinin başlanğıcında və massivinin sonunda təyin edin. Massiv artıq problem şərtlərinə əsasən sıralanmışdır.
Göstəricilər və görüşmədiyi müddətdə, aşağıdakı əməliyyatları yerinə yetirin:
Əgər olarsa, tələb olunan cüt tapılmışdır. Çap edin və proqramı dayandırın.
Əgər olarsa, göstərici -ni bir mövqe sağa hərəkət etdirin. Bu halda artacaq;
Əgər olarsa, göstərici -ni bir mövqe sola hərəkət etdirin. Bu halda azalacaq;
Nümunə
Gəlin ilk testi nəzərdən keçirək. Göstəriciləri başla. Alqoritmin işləməsini simulyasiya edək. -dir, -ə bərabər olan iki ədəd axtarırıq.
Giriş məlumatlarını oxuyun.
scanf("%d %d", &n, &x); v.resize(n); for (i = 0; i < n; i++) scanf("%d", &v[i]);
Göstəriciləri təyin edin.
int i = 0, j = v.size() - 1;
Göstərici -ni irəlilədin və -ni gerilədin.
while (i < j) {
Əgər olarsa, tələb olunan cüt tapılmışdır. Çap edin və proqramı dayandırın.
if (v[i] + v[j] == x) { printf("BƏLİ\n"); return 0; }
Əgər olarsa, göstərici -ni bir mövqe sağa hərəkət etdirin;
Əgər olarsa, göstərici -ni bir mövqe sola hərəkət etdirin;
if (v[i] + v[j] < x) i++; else j--; }
Əgər tələb olunan cüt tapılmayıbsa, "YOX" çap edin.
printf("YOX\n");
Verilmiş tam ədəd massivində ədədinə bərabər olan ədədlərini tapın. Bütün indekslər fərqli olmalıdır.
Giriş. İlk sətirdə massiv ölçüsü və dəyəri var. İkinci sətirdə tam ədəd var, hər biri -dan böyük deyil.
Çıxış. Əgər tələb olunan üçlük varsa, onu istənilən sırada çap edin. Əgər bir neçə üçlük varsa, hər hansı birini çap edin. Əgər tələb olunan üçlük yoxdursa, çap edin.
8 19 20 3 5 1 15 7 17 12
1 3 15
Gəlin giriş massivini nəzərdən keçirək. Mümkün olan bütün indeksləri olaraq dövr edin. Sonra, hər bir dəyəri üçün və olan indeks cütlərini tapın. Bu, sıralanmış massivdə iki göstərici texnikası ilə xətti vaxtda əldə edilə bilər.
Giriş məlumatlarını oxuyun.
cin >> n >> x; v.resize(n); for (i = 0; i < n; i++) cin >> v[i];
Giriş massivini sıralayın.
sort(v.begin(), v.end());
dəyərləri üçün dövr edin.
for (k = 0; k < n - 2; k++) {
və indeks cütlərini tapın. və indekslərini təyin edin.
i = k + 1; j = n - 1; s = x - v[k];
İki göstərici texnikasından istifadə edərək istənilən cüt -ni tapın.
while (i < j) { if (v[i] + v[j] == s) {
Əgər cütü tapılmışdırsa, istənilən ədədləri çap edin.
printf("%d %d %d\n", v[k], v[i], v[j]); return 0; }
Əgər olarsa, göstərici -ni bir mövqe sağa hərəkət etdirin;
Əgər olarsa, göstərici -ni bir mövqe sola hərəkət etdirin;
if (v[i] + v[j] < s) i++; else j--; } }
Əgər ədədlərin üçlüyü tapılmadısa, çap edin.
cout << -1 << endl;
Verilmiş sıralanmış massivində tam ədəd var. Hər bir indeks üçün, və arasında olan elementlərin sayını tapın, daxil olmaqla.
Giriş. İlk sətirdə massivinin ölçüsü var. İkinci sətirdə tam ədəd, hər biri -dan -a qədər, sıralanmış olaraq var.
Çıxış. tam ədəd çap edin. Hər bir üçün, və arasında, daxil olmaqla, olan elementlərin sayını çap edin.
10 1 2 3 4 5 6 7 8 9 10
2 3 4 5 6 5 4 3 2 1
intervalı yaxşı sayılır əgər içindəki ədədlər intervalında yerləşirsə (yəni ).
İki göstərici və istifadə edərək bir sürüşdürmə pəncərəsi yaradaq və onu saxlayaraq belə bir şəkildə saxlayaq ki, cari interval yaxşı olsun, eyni zamanda isə pis olsun.
Məsələn, aşağıdakı ardıcıllıq üçün:
və intervalı yaxşıdır.
intervalı pisdir.
Əgər olarsa, cari intervalı ilə genişləndirin. Əks halda, onu ilə daraldın. -ni hərəkət etdirmədən əvvəl və arasında, daxil olmaqla, olan elementlərin sayını çap edin. Bu, -yə bərabərdir.
Alqoritmin mürəkkəbliyi xətti, yəni -dir.
Nümunə
Verilmiş nümunə üçün göstəricilərin hərəkətini düşünək.
Verilmiş şərtlər üçün olduğuna görə, göstərici -ni irəliləyin.
İndi . Göstərici -ni irəliləmək lazımdır. Lakin, onu hərəkət etdirməzdən əvvəl və arasında, daxil olmaqla, olan elementlərin sayını çap edin. Bu, -ə bərabərdir.
olduğu müddətdə -ni irəliləyin.
İndi . üçün cavabı çap edin (bu, -dir) və -ni 1 artırın.
Giriş məlumatlarını oxuyun.
scanf("%d", &n); for (i = 0; i < n; i++) scanf("%d", &a[i]);
Göstəriciləri ilə təyin edin.
i = j = 0;
Hər bir dəyəri üçün cavab tapana qədər göstəriciləri irəliləyin.
while (i < n) // [i..j] {
Əgər (və massiv sərhədlərini keçməyibsə, yəni ), cari intervalları ilə genişləndirin.
if ((j < n) && (a[j] <= 2 * a[i])) j++; else {
Əgər olarsa, indeksi üçün cavabı çap edin və -ni bir artırın.
printf("%d ", j - i); i++; } }
Gözəl Adriatik sahili boyunca otel var. Hər bir otelin qiyməti avro ilə ifadə edilir. Petr lotereyada avro qazandı. İndi o, bu ardıcıl otellərin cəminin mümkün olduğu qədər böyük olmasını istəyir, amma -i keçməməlidir.
Maksimal mümkün qiyməti hesablamağınız lazımdır.
Giriş. İlk sətirdə iki tam ədəd və var. Növbəti sətirdə müsbət tam ədəd var, sahil boyunca yerləşən otellərin qiymətləri.
Çıxış. İstənilən qiymətləri çap edin (bütün testlərdə 0-dan böyük olacaq).
5 12 2 1 3 4 5
12
Otel qiymətlərini massivində saxlayın. intervalını yaxşı sayacağıq, əgər içindəki otel qiymətləri -i keçməsə.
Gəlin iki indeks və ilə sürüşdürmə pəncərəsi tətbiq edək, belə ki, cari interval yaxşı olsun. isə cari intervallardakı otel qiymətlərinin cəmini saxlayır. Cari intervalda olan bütün ədədlər queue-da saxlanılır.
Nümunə
Gəlin göstəricilərin hərəkətini bu nümunə üçün düşünək.
Maksimum qiyməti, bütün yaxşı intervallardakı qiymətlərin içində tapın.
Giriş məlumatlarını oxuyun.
scanf("%d %lld", &n, &m);
İndiki dəyişənləri təyin edin:
-də, bütün işlənmiş yaxşı intervallardakı qiymətlərin maksimumunu hesablayın;
-də, cari intervallardakı ədədlərin cəmini saxlayın. Cari intervallardakı bütün ədədlər queue-da saxlanılır;
s = res = 0;
Otel qiymətlərini ardıcıl işləyin.
for (i = 0; i < n; i++) {
Cari otelin qiymətini oxuyun və onu queue-ya əlavə edin.
scanf("%d", &val); q.push(val);
Cari intervallardakı cəmini yeniləyin. Bütün cari intervallardakı elementlər queue-da saxlanılır.
s += val;
Əgər cari intervallardakı cəmi , -i keçərsə, intervallardan başından elementləri çıxarın.
while (s > m) { s -= q.front(); q.pop(); }
Yaxşı intervallardakı ədədlərin cəmi arasında maksimum qiyməti -i yeniləyin (otellərin qiymətləri -i keçməməlidir).
if (s > res) res = s; }
Cavabı çap edin.
printf("%lld\n", res);
Verilmiş müsbət tam ədəd massivini, -ə bərabər olan alt massivlərin sayını tapın.
Giriş. İlk sətirdə massiv ölçüsü və hədəf cəmi . Növbəti sətirdə ədəd — massiv məzmunu.
Çıxış. Lazım olan alt massivlərin sayını çap edin.
5 7 2 4 1 2 7
3
Gəlin iki göstərici və ilə sürüşdürmə pəncərəsi tətbiq edək. Hər bir sabit üçün intervalını mümkün qədər genişləndirin, belə ki, elementlərinin cəmi -i keçməsin. Başqa sözlə, hər üçün, intervalındakı elementlərin cəminin -i keçmədiyi, intervalındakı elementlərin cəminin -i keçdiyi ən böyük -ni axtarın.
Gəlin -ni intervalındakı ədədlərin cəmi ilə saxlayırıq. Əgər olarsa, intervalını genişləndirin. Əks halda, intervalını daraldın. -ə bərabər olan alt massivlərin sayını hesablayın.
Nümunə
Gəlin verilmiş nümunə üçün göstəricilərin hərəkətini araşdıraq.
, irəliləyir ki, intervalındakı ədədlərin cəmi -i keçməsin. intervalında dayanırıq, çünki burada ədədlərin cəmi -dir, intervalında isə cəmi artıq -dur.
, irəliləyir ki, intervalındakı ədədlərin cəmi -i keçməsin. intervalında dayanırıq, çünki burada cəmi -dir, intervalında isə cəmi -dür.
, nəzərdən keçirilən interval -dür. Burada ədədlərin cəmi -dür, amma intervalında cəmi -dur, bu da -dən çoxdur.
, nəzərdən keçirilən interval -dür. Burada ədədlərin cəmi -dir, amma intervalında cəmi -dur, bu da -dən çoxdur.
, nəzərdən keçirilən interval -dür. Burada ədədlərin cəmi -dir.
olan alt massivlərin sayı -dür. Onlar və indekslərində başlayırlar.
Bir massiv elan edin.
#define MAX 200001 long long a[MAX];
Giriş məlumatlarını oxuyun.
scanf("%d %lld", &n, &x); for (i = 0; i < n; i++) scanf("%lld", &a[i]);
Başlanğıc intervalını olaraq təyin edin. Bu intervaldakı ədədlərin cəmi -dir.
s = j = 0;
Hər bir dəyəri üçün ardıcıl intervallarını işləyin.
for (i = 0; i < n; i++) {
Sabit sol son olan intervalında -nin ən böyük dəyərini tapın ki, cəmi -i keçməsin.
while ((j < n) && (s + a[j] <= x)) s += a[j++];
Cari intervalındakı ədədlərin cəmi -ə bərabər olduqda, istədiyimiz alt massiv sayını -ni artırın.
if (s == x) cnt++;
intervalındakı -ni yenidən hesablayın.
s -= a[i]; }
Cavabı çap edin.
printf("%lld\n", cnt);
Ziya sabah ardıcıllıq müsabiqəsində iştirak edəcək. ədədi, bir ardıcıllığın zirvəsi sayılır, əgər ardıcıllıq bu ardıcıllığın alt ardıcıllığıdır. Hər bir ardıcıllığın gücü onun ən böyük zirvəsi sayılır.
Sabah bütün tələbələr müsabiqəyə gedəcəklər və ən güclü ardıcıllığın qalibi olacaq. Ziya ardıcıllığına sahibdir. O, bu gün bütün ardıcıllıqlara üstünlük verərək daha güclü ardıcıllığı seçmək istəyir. Ancaq Ziya öz ardıcıllığının gücünü bilmir, lakin qalib olmaq istəyir. Ona kömək edin ki, öz ardıcıllığının gücünü hesablasın.
Giriş. İlk sətirdə Ziyanın ardıcıllığında olan ədədlərin sayı var. Növbəti sətirdə tam ədəd — ardıcıllığın elementləridir.
Çıxış. Bir ədəd çap edin — verilmiş ardıcıllığın gücüdür.
2 2 10
0
3 1 2 3
1
5 1 10 2 3 1
2
Gəlin giriş ədədləri massivini nəzərdən keçirək. İki göstəricini massivinin əvvəlində və massivinin sonunda təyin edək. Gücünü dəyişəndə -ni sayırıq. Başlanğıcda, -dir.
Göstəricilər və görüşənə qədər aşağıdakı əməliyyatları yerinə yetirin:
-ya bərabər olmayan ədədlərə rast gəlmədiyi müddətdə, göstərici -ni sağa doğru bir yerə keçirin.
-ya bərabər olmayan ədədlərə rast gəlmədiyi müddətdə, göstərici -ni sola doğru bir yerə keçirin.
Hər iki göstərici -ya bərabər olduqda, -ni bir artırın və hər bir göstəricini müvafiq istiqamətdə bir mövqe irəlilədin.
Alqoritm tamamlandıqda, cavab dəyəri olacaq.
Nümunə
İkinci testi nəzərdən keçirək. Göstəriciləri başla. Göstərici -ni sağa, göstərici -ni sola doğru hərəkət etdirin ki, hər iki göstərici -ə bərabər olsun.
Göstərici -ni sağa, göstərici -ni sola doğru hərəkət etdirin ki, hər iki göstərici -yə bərabər olsun.
Göstəricilər görüşür, alqoritmi dayandırın. Cavab olacaq.
Giriş məlumatlarını oxuyun.
scanf("%d", &n); v.resize(n); for (i = 0; i < n; i++) scanf("%d", &v[i]);
Göstəriciləri massivinin başlanğıcında və sonunda yerləşdirin.
int i = 0, j = v.size() - 1;
Güc dəyişənini sayın.
k = 1; while (i <= j) {
Göstərici -ni sağa doğru keçirin ki, -ya bərabər olmayan ədədlərə rast gəlməyəsiniz.
if (v[i] != k) i++;
Göstərici -ni sola doğru keçirin ki, -ya bərabər olmayan ədədlərə rast gəlməyəsiniz.
if (v[j] != k) j--;
Hər iki göstərici -ya bərabər olduqda, -ni artırın.
if (v[i] == k && v[j] == k) k++; }
Cavabı çap edin.
printf("%d\n", k - 1);