Муаллима 30 баҳои санҷишӣ дорад, ҳар кадом аз 1 то 5. Вай мехоҳад бидонад, ки чанд хонанда ҳар як баҳоро гирифтааст. Бо василаҳое, ки шумо медонед, ба чанд тағйирёбанда эҳтиёҷ мешуд? Чанд сатри if?
Барои ҳар қимат як қуттӣ
Баҳо адади хурд аст ва адади хурд метавонад индекс шавад. Барои ҳар қимати имконпазир як ҳисобкунак дар вектор созед: cnt[v] нишон медиҳад, ки қимати v чанд бор дида шудааст. Вақте қимати x-ро мехонед, намепурсед, ки он кадом аст. Шумо рост ба катаки он меравед: cnt[x]++.
Даҳ хонанда барои ҷои сафари мактабӣ овоз медиҳанд. Ҳар овоз адад аз 1 то 5 аст. Чоп кунед, ки ҳар ҷой чанд овоз гирифт.
Вуруд
Баромад
Вектор 6 катак дорад, чунки индекси калонтарин 5 аст. Катаки 0 ҳеҷ гоҳ истифода намешавад. Барои ҳар қимат if нест: худи қимат қуттии худро меёбад.
Ҳар овоз ба қуттии рақами худ меравад. Қуттиҳо катакҳои cnt мебошанд.
Шаш овозро қадам ба қадам гузаред:
Овозҳо дар қуттиҳо: cnt[x]++
C++
1#include <bits/stdc++.h>
2using namespace std;
3
4int main() {
5 vector<int> a = {3, 5, 3, 1, 3, 5};
6 vector<int> cnt(6, 0);
7 for (int x : a) {
8 cnt[x]++;
9 }
10 cout << cnt[3] << "\n";
11 return 0;
12}
Шаш овоз
сатр 5
Ҳар овоз адад аз 1 то 5 аст.
a6 катак
3
5
3
1
3
5
0
1
2
3
4
5
cnt6 катак
—
—
—
—
—
—
0
1
2
3
4
5
x—
пахш кун
1 / 15
Кадом адад намондааст?
n - 1 чиптаи гуногун аз 1 то n баргардонида шуд. Кадом чипта намондааст? Ҳар чиптаеро, ки дидед, нишон кунед. Дар ҳар катаки vector<bool>true ё false меистад:
Бо n = 6 ва чиптаҳои 4 1 6 2 3 барнома 5-ро чоп мекунад. Нишон кардани як чипта як қадам аст ва пурсидани «оё дида шуд?» низ як қадам аст. Ҷустуҷӯ лозим нест.
Қимати бештар вомехӯрда ва қиматҳои гуногун
Баъд аз шумориш аз болои қиматҳо гузашта, ҳисобкунакҳоро нигаред. Санҷиш > аст, на >=, бинобар ин ҳангоми баробарӣ қимати хурдтар мемонад:
Барои ададҳои 2 4 2 5 4 2 4 қиматҳои 2 ва 4 ҳар кадом 3 бор меоянд. Барнома best = 2 ва different = 3-ро меёбад.
Қиматҳои манфӣ
Индекс манфӣ шуда наметавонад. Агар қиматҳо аз -1000 то 1000 бошанд, онҳоро лағжонед: cnt[x + 1000]-ро истифода баред ва векторро 2001 катак дароз кунед. Қимати -3 дар катаки 997 ва қимати 0 дар катаки 1000 мебошад.
Вақте қиматро баръакс чоп мекунед, 1000-ро боз кам кунед.
Ҷуфтҳои қиматҳои баробар
Чанд ҷуфти (i, j) бо i < j ададҳои баробар доранд? Вақте x-и нав вомехӯрад, бо ҳар x-и пештара ҷуфт мешавад. Чунин ҷуфтҳо cnt[x] мебошанд. Аввал онҳоро илова кунед ва танҳо баъд адади навро шумор кунед:
Барои 1 2 1 1 2 барнома 4-ро чоп мекунад. 1-и дуюм бо як 1-и пештара, 1-и сеюм бо ду 1-и пештара ва 2-и дуюм бо як 2-и пештара ҷуфт мешавад. Бо 10⁵ адади баробар ҷавоб тақрибан 5 · 10⁹ мешавад, бинобар ин pairs навъи long long аст. Агар ду сатрро ҷой иваз кунед, ҳар адад бо худаш низ ҷуфт мешавад.
Вақте мувофиқ нест
Вектор барои ҳар қимати имконпазир як катак лозим дорад. Агар шарти масъала 1 ≤ a_i ≤ 10⁹ гӯяд, вектори 10⁹ + 1 ҷузъи int 4 ГБ мешавад, ки аз маҳдудияти ҳофизаи масъала хеле зиёд аст. Қиматҳо то тақрибан 10⁶ мувофиқанд. Барои қиматҳои калон ё барои калимаҳо, дарси баъдӣ map-ро нишон медиҳад.
Худатон иҷро кунед
Ҳисоб аз рӯи қиматсанҷида бин!
Худро санҷед
Вазифаи хонагӣ
Супоришҳоро дар лаборатория иҷро кунед.
Масъалаҳои 1 то 5-и Машқ: ҳисоб аз рӯи қимат-ро ҳал кунед. Масъалаҳои 6 ва 7 душвортаранд: онҳоро дар машғулияти амалӣ санҷед.
Вақте қиматҳо хурданд, худи қимат метавонад индекс шавад: cnt[x]++.
Адади намонда: бо seen[x] = true нишон кунед. Қимати бештар вомехӯрда: сикл бо >. Қиматҳои гуногун: катакҳои бо cnt[v] > 0-ро бишуморед.
Қиматҳои манфӣ: индексро лағжонед, cnt[x + 1000].
Ҷуфтҳои қиматҳои баробар: cnt[x]-ро пеш аз шумориши x илова кунед, дар long long.
Вақте қиматҳо азим бошанд, ин мувофиқ нест: барои ҳар қимати имконпазир як катак лозим аст.
10
3 5 1 3 3 2 5 3 1 4
1: 2
2: 1
3: 4
4: 1
5: 2
Оё медонед?
Шумориш роҳи танзим кардан низ ҳаст. Ҳар қиматро бишуморед, баъд ҳар қиматро cnt[v] бор аз хурдтарин v то калонтарин нависед. Ин танзими шуморишӣ ном дорад ва Ҳаролд Сьюард онро соли 1954 тавсиф кардааст. Он бидуни муқоисаи ду адад танзим мекунад.
Калимаҳои калидӣ
ҳисоб аз рӯи қиматиндекснишоналағжишҷуфти қиматҳои баробар
Ман дар ин дарс чӣ омӯхтам?
✓ Ман қиматҳоро бо cnt[x]++ мешуморам.
✓ Ман ҷавобро аз ҳисобкунакҳо бо тартиби дуруст мехонам.
Барои ҷавоб додан ва нигоҳ доштани пешрафт ворид шавед.Ворид шудан
vector<bool> seen(n + 1, false);for(int i = 0; i < n - 1; i++){ int t; cin >> t; seen[t] = true;}for(int t = 1; t <= n; t++){ if(!seen[t]){ cout << t << "\n";}}
int best = 1;for(int v = 1; v <= 5; v++){ if(cnt[v]> cnt[best]){ best = v;}}int different = 0;for(int v = 1; v <= 5; v++){ if(cnt[v]> 0){ different++;}}
vector<int> cnt(2001, 0);cnt[x + 1000]++;
long long pairs = 0;for(int x : a){ pairs += cnt[x]; cnt[x]++;}