Module ā§§ā§Ē ¡ āϝ⧠algorithm-āĻā§āϞ⧠āĻĒā§āϰāϤāĻŋ āϏāĻĒā§āϤāĻžāĻšā§āĻ āϞāĻžāĻāĻŦā§: accumulate āĻĨā§āĻā§ nth_element
Algorithm: āĻāĻāĻāĻž loop-āĻāϰ āĻāĻžāϝāĻŧāĻāĻžāϝāĻŧ āĻāĻāĻāĻž call, āĻāϰ āĻāĻāĻāĻž set-āĻāϰ āĻĒā§āϰāϤāĻŋāĻāĻž āĻā§āϰāĻŽ
āĻāĻ lesson-āĻ āϝāĻž āĻļāĻŋāĻāĻŦā§
- āĻŽā§āĻ āϝā§āĻāĻĢāϞ, āϏāĻŦāĻā§āϝāĻŧā§ āĻŦāĻĄāĻŧ āĻŽāĻžāύ, āĻāϝāĻŧāĻāĻž āĻāĻā§ āĻā§āύāĻž āĻāϰ āĻāϞā§āĻā§ āĻĻā§āĻāϝāĻŧāĻžāϰ āĻšāĻžāϤ⧠āϞā§āĻāĻž loop-āĻā§āϞā§āϰ āĻāĻžāϝāĻŧāĻāĻžāϝāĻŧ
accumulate,max_element,countāĻāϰreverseāĻŦāϏāĻžāϤ⧠āĻĒāĻžāϰāĻŦā§, āĻĒā§āϰāϤāĻŋāĻāĻž āĻāĻāĻāĻž range[first, last)-āĻāϰ āĻāĻĒāϰāĨ¤ sortāĻāϰnext_permutation-āĻā§ āĻāĻŋāϰ⧠āĻāĻāĻāĻž do-while āĻĻāĻŋāϝāĻŧā§ āĻāĻāĻāĻž set-āĻāϰ āĻĒā§āϰāϤāĻŋāĻāĻž āĻā§āϰāĻŽ āĻā§āϰ⧠āĻĻā§āĻāϤ⧠āĻĒāĻžāϰāĻŦā§, āĻāϰ āĻŦā§āĻāĻŋāϝāĻŧā§ āĻŦāϞāϤ⧠āĻĒāĻžāϰāĻŦā§ sort āĻā§āύ āĻāĻā§ āϞāĻžāĻā§āĨ¤- āĻāϤā§āϤāϰāĻāĻž āϝ⧠type-āĻ āĻĻāϰāĻāĻžāϰ, āϏā§āĻ āĻšāĻŋāϏā§āĻŦā§
accumulate-āĻāϰ āĻļā§āϰā§āϰ āĻŽāĻžāύ0,0LLāύāĻžāĻāĻŋ0.0āĻšāĻŦā§, āĻŦā§āĻā§ āύāĻŋāϤ⧠āĻĒāĻžāϰāĻŦā§, āĻāϰ āĻĒā§āϰāϤāĻŋāĻāĻž call-āĻāϰ āĻāϰāĻ āĻŦāϞāϤ⧠āĻĒāĻžāϰāĻŦā§āĨ¤
Bob āĻŦāύā§āϧā§āĻĻā§āϰ āĻāĻāĻāĻž āĻāĻŦāĻŋāϰ āĻāύā§āϝ āĻāĻ āϏāĻžāϰāĻŋ āĻā§āϝāĻŧāĻžāϰ⧠āĻŦāϏāĻžāĻā§āĻā§, āĻāϰ āϏ⧠āĻĒā§āϰāϤāĻŋāĻāĻž āĻŦāϏāĻžāϰ āĻā§āϰāĻŽ āĻāĻāĻŦāĻžāϰ āĻāϰ⧠āĻĻā§āĻāϤ⧠āĻāĻžāϝāĻŧāĨ¤ āϤāĻŋāύāĻāύ āĻŦāύā§āϧā§āϰ āĻāύā§āϝ āϏ⧠āϞā§āĻā§ āϤāĻŋāύāĻāĻž nested loop, āĻāϝāĻŧāĻāύā§āϰ āĻāύā§āϝ āĻāϝāĻŧāĻāĻžāĨ¤ āϤāĻžāϰāĻĒāϰ Maria āĻŦāϞā§, āĻāϝāĻŧāĻāύ āĻāϏāĻŦā§ āĻā§āĻ āĻāĻžāύ⧠āύāĻž, āĻāϰ loop-āĻāϰ āĻā§āύ⧠āĻŦāĻžāĻāϧāĻž āϏāĻāĻā§āϝāĻž āĻĻāĻŋāϝāĻŧā§ āϏā§āĻāĻž āĻšāϝāĻŧ āύāĻžāĨ¤ āĻĻāĻŋāύāĻļā§āώ⧠Amara āĻāĻžāύāϤ⧠āĻāĻžāϝāĻŧ cafÊ-āϰ āĻŽā§āĻ āĻŦāĻŋāĻā§āϰāĻŋ, āϏāĻŦāĻā§āϝāĻŧā§ āĻāĻžāϞ⧠āĻāĻŖā§āĻāĻžāĻāĻž, āĻāϰ āĻāϝāĻŧ āĻāĻŖā§āĻāĻžāϝāĻŧ āĻ āĻŋāĻ 30 āĻāĻžāĻĒ āĻŦāĻŋāĻā§āϰāĻŋ āĻšāϝāĻŧā§āĻā§āĨ¤ Bob āĻāϰāĻ āϤāĻŋāύāĻāĻž loop āϞā§āĻā§, āĻāϰ āϤāĻžāϰ āĻāĻāĻāĻž āĻļā§āϰ⧠āĻšāϝāĻŧ index 0-āϰ āĻŦāĻĻāϞ⧠1 āĻĨā§āĻā§āĨ¤
āĻāĻ āĻĒā§āϰāϤāĻŋāĻāĻž āĻāĻžāĻ standard library-āϤ⧠āĻŽāĻžāϤā§āϰ āĻāĻāĻāĻž callāĨ¤ āĻāĻ lesson āĻĻā§āĻāĻžāĻŦā§ call-āĻā§āϞ⧠āĻā§, āĻāϰāĻž āĻāĻāĻāĻž container-āĻā§ āĻā§āĻāĻžāĻŦā§ āĻĻā§āĻā§, āĻāϰ āĻĒā§āϰāϤāĻŋāĻāĻžāϰ āĻāϰāĻ āĻāϤāĨ¤
Algorithm āĻšāϞ⧠āĻāĻŽāύ āĻāĻāĻāĻž function, āϝā§āĻāĻž āĻāĻāĻāĻž range āύā§āϝāĻŧ
STL-āĻ āĻāĻāĻāĻž algorithm āĻšāϞ⧠āĻāĻŽāύ āĻāĻāĻāĻž function, āϝā§āĻāĻž āĻāĻžāĻ āĻāϰ⧠element-āĻāϰ āĻāĻāĻāĻž range-āĻāϰ āĻāĻĒāϰ, āĻĒā§āϰ⧠container-āĻāϰ āĻāĻĒāϰ āύāĻžāĨ¤ āϤā§āĻŽāĻŋ āĻāϰ āĻšāĻžāϤ⧠Module 11-āĻāϰ āĻĻā§āĻāĻāĻž iterator āĻĻāĻžāĻ, first āĻāϰ lastāĨ¤ āĻ first āĻĨā§āĻā§ āĻļā§āϰ⧠āĻāϰ⧠āĻĒāϰā§āϰ āĻĒā§āϰāϤāĻŋāĻāĻž element āύā§āϝāĻŧ, last āĻĒāϰā§āϝāύā§āϤ, āĻāĻŋāύā§āϤ⧠āĻāĻāĻžāĻā§ āύāĻŋāĻā§ āύā§āϝāĻŧ āύāĻžāĨ¤ āĻāĻāĻžāĻā§āĻ āĻŦāϞ⧠half-open range [first, last)āĨ¤
āϝ⧠algorithm-āĻā§āϞ⧠āĻšāĻŋāϏāĻžāĻŦ-āύāĻŋāĻāĻžāĻļ āĻāϰā§, āϝā§āĻŽāύ accumulate, āĻāϰāĻž āĻĨāĻžāĻā§ <numeric> header-āĻāĨ¤ āĻŦāĻžāĻāĻŋāϰāĻž, āϝā§āĻŽāύ count, max_element, reverse āĻāϰ next_permutation, āĻĨāĻžāĻā§ <algorithm>-āĻāĨ¤ āύāĻŋāĻā§ āĻĻā§āĻāĻāĻž call āĻāĻā§, āĻĒā§āϰāϤāĻŋāĻāĻž āĻāĻāĻŦāĻžāϰ āĻĒā§āϰ⧠vector-āĻāϰ āĻāĻĒāϰ, āĻāϰā§āĻāĻŦāĻžāϰ āĻāϰ āĻāĻāĻāĻž āĻ
āĻāĻļā§āϰ āĻāĻĒāϰāĨ¤
#include <algorithm>
#include <iostream>
#include <numeric>
#include <vector>
using namespace std;
int main() {
vector<int> sold{4, 7, 2, 9, 5, 7};
cout << accumulate(sold.begin(), sold.end(), 0) << '\n';
cout << accumulate(sold.begin() + 1, sold.begin() + 4, 0) << '\n';
cout << count(sold.begin(), sold.end(), 7) << '\n';
cout << count(sold.begin(), sold.begin() + 3, 7) << '\n';
return 0;
}
34
18
2
1
āĻĒā§āϰ⧠vector āϝā§āĻ āĻāϰāϞ⧠āĻšāϝāĻŧ 34āĨ¤ sold.begin() + 1 āĻĨā§āĻā§ sold.begin() + 4 āϧāϰ⧠position 1, 2 āĻāϰ 3, āϤāĻžāĻ āĻĻā§āĻŦāĻŋāϤā§āϝāĻŧ āϞāĻžāĻāύāĻāĻž 7 + 2 + 9 = 18āĨ¤ count āĻĒā§āϰ⧠vector-āĻ āĻĻā§āĻāĻāĻž 7 āĻĒā§āϝāĻŧā§āĻā§, āĻāϰ āĻĒā§āϰāĻĨāĻŽ āϤāĻŋāύāĻāĻž position-āĻ āĻĒā§āϝāĻŧā§āĻā§ āĻāĻāĻāĻžāĨ¤
[first, last): first āύā§āĻāϝāĻŧāĻž āĻšāϝāĻŧ, last āύāĻžāĨ¤ āĻĒā§āϰ⧠vector-āĻāĻžāĻ āĻāĻāĻāĻž range, āĻāϰ āĻāϰ position 1 āĻĨā§āĻā§ 3-āĻ āĻāĻāĻāĻž rangeāĨ¤āϤāĻžāĻ āĻāĻāĻ call āĻĒā§āϰ⧠vector-āĻāϰ āĻāĻĒāϰāĻ āĻāϞā§, āĻāĻŦāĻžāϰ āĻāϰ āϝā§āĻā§āύ⧠āĻāĻāĻāĻž āĻ āĻāĻļā§āϰ āĻāĻĒāϰāĻ āĻāϞā§; āĻŦāĻĻāϞāĻžāϝāĻŧ āĻļā§āϧ⧠iterator āĻĻā§āĻāĻāĻžāĨ¤
āϝ⧠āĻāĻžāϰāĻāĻž loop āĻāϰ āϞāĻŋāĻāϤ⧠āĻšāĻŦā§ āύāĻž
āĻāĻ āĻšāϞ⧠Amara-āϰ āĻĻāĻŋāύāĻļā§āώā§āϰ āĻšāĻŋāϏāĻžāĻŦ: āĻĒāĻžāĻāĻ āĻāĻŖā§āĻāĻžāϰ āĻĒā§āϰāϤāĻŋāĻāĻžāϝāĻŧ āĻāϝāĻŧ āĻāĻžāĻĒ āĻŦāĻŋāĻā§āϰāĻŋ āĻšāϝāĻŧā§āĻā§āĨ¤ Program-āĻāĻž āĻĒā§āϰāϤāĻŋāĻāĻž āĻĒā§āϰāĻļā§āύā§āϰ āĻāϤā§āϤāϰ āĻĻā§āĻāĻŦāĻžāϰ āĻĻā§āϝāĻŧ, āĻāĻā§ Bob-āĻāϰ āĻšāĻžāϤ⧠āϞā§āĻāĻž loop āĻĻāĻŋāϝāĻŧā§, āϤāĻžāϰāĻĒāϰ āĻāĻāĻāĻž āĻāϰ⧠call āĻĻāĻŋāϝāĻŧā§āĨ¤ āĻļā§āώ⧠reverse āĻĻāĻŋāϝāĻŧā§ vector-āĻāĻžāĻā§ āĻāϞā§āĻā§ āĻĻā§āϝāĻŧāĨ¤
#include <algorithm>
#include <iostream>
#include <numeric>
#include <vector>
using namespace std;
int main() {
vector<int> cups{12, 30, 18, 30, 9};
int total = 0;
for (int x : cups) {
total += x;
}
int biggest = cups[0];
for (int x : cups) {
if (x > biggest) {
biggest = x;
}
}
int thirties = 0;
for (int x : cups) {
if (x == 30) {
thirties++;
}
}
cout << "loops: " << total << ' ' << biggest << ' ' << thirties << '\n';
cout << "calls: " << accumulate(cups.begin(), cups.end(), 0) << ' '
<< *max_element(cups.begin(), cups.end()) << ' '
<< count(cups.begin(), cups.end(), 30) << '\n';
reverse(cups.begin(), cups.end());
cout << "reversed:";
for (int x : cups) {
cout << ' ' << x;
}
cout << '\n';
return 0;
}
loops: 99 30 2
calls: 99 30 2
reversed: 9 30 18 30 12
| āĻāĻžāĻ | āĻšāĻžāϤ⧠āϞā§āĻāĻž loop | āĻāĻāĻāĻž call |
|---|---|---|
| āĻŽā§āĻ āϝā§āĻāĻĢāϞ | āĻāĻāĻāĻž āĻāϞāϤāĻŋ āϝā§āĻāĻĢāϞ, āĻļā§āϰ⧠0 āĻĨā§āĻā§ | accumulate(v.begin(), v.end(), 0) |
| āϏāĻŦāĻā§āϝāĻŧā§ āĻŦāĻĄāĻŧāĻāĻž | āĻāĻāύ āĻĒāϰā§āϝāύā§āϤ āϏā§āϰāĻžāĻāĻž, āĻļā§āϰ⧠āĻĒā§āϰāĻĨāĻŽ element āĻĨā§āĻā§ | *max_element(v.begin(), v.end()) |
| x-āĻāϰ āϏāĻŽāĻžāύ āĻāϝāĻŧāĻāĻž | āĻāĻāĻāĻž counter āĻāϰ āĻāĻāĻāĻž if | count(v.begin(), v.end(), x) |
| āĻāϞā§āĻā§ āĻā§āϰāĻŽā§ | āĻĻā§āĻ āĻŽāĻžāĻĨāĻž āĻĨā§āĻā§ āĻĻā§āĻāĻāĻž index, āĻŽāĻžāĻā§āϰ āĻĻāĻŋāĻā§ swap āĻāϰāϤ⧠āĻāϰāϤ⧠| reverse(v.begin(), v.end()) |
āĻĻā§āĻ āĻĒāĻĨā§āĻ āĻāĻāĻ āϏāĻāĻā§āϝāĻž print āĻšāϞā§āĨ¤ Call-āĻā§āϞā§āϤ⧠āĻāĻŽāύ āĻā§āύ⧠index āύā§āĻ āϝā§āĻāĻž āĻā§āϞ āĻāϰ⧠1 āĻĨā§āĻā§ āĻļā§āϰ⧠āĻšāĻŦā§, āĻāĻŽāύ āĻā§āύ⧠āϏā§āϰāĻž-āĻāĻāύ-āĻĒāϰā§āϝāύā§āϤ āύā§āĻ āϝā§āĻāĻž āĻā§āϞ āĻŽāĻžāύ āĻĻāĻŋāϝāĻŧā§ āĻļā§āϰ⧠āĻšāĻŦā§āĨ¤ <-āĻāϰ āĻāĻžāϝāĻŧāĻāĻžāϝāĻŧ āĻā§āϞ āĻāϰ⧠<= āϞā§āĻāĻžāϰ āϏā§āϝā§āĻāĻ āύā§āĻāĨ¤ max_element āĻāĻāĻāĻž āĻŽāĻžāύ āύāĻž, āĻāĻāĻāĻž iterator āĻĢā§āϰāϤ āĻĻā§āϝāĻŧ, āϤāĻžāĻ program āĻŽāĻžāύāĻāĻž āĻĒāĻĄāĻŧā§ * āĻĻāĻŋāϝāĻŧā§āĨ¤ āϤāĻžāĻ āĻĒā§āϰāϤāĻŋāĻāĻž call āĻāĻ āϞāĻžāĻāύ⧠āύāĻŋāĻā§āϰ āĻāĻžāĻā§āϰ āύāĻžāĻŽ āĻŦāϞ⧠āĻĻā§āϝāĻŧ, āĻāϰ loop-āĻāĻž āĻāϧāĻžāĻāĨ¤
āĻāĻāĻāĻž set-āĻāϰ āĻĒā§āϰāϤāĻŋāĻāĻž āĻā§āϰāĻŽ: next_permutation
Bob-āĻāϰ āĻŦāϏāĻžāϰ āĻā§āϰāĻŽāĻā§āϞ⧠āĻšāϞ⧠permutation: āĻāĻāĻ āĻāĻŋāύāĻŋāϏāĻā§āϞā§āϰ āĻĒā§āϰāϤāĻŋāĻāĻž āϏāĻŽā§āĻāĻžāĻŦā§āϝ āĻā§āϰāĻŽāĨ¤ āϤāĻŋāύāĻāύ āĻŦāύā§āϧ⧠āĻŦāϏāϤ⧠āĻĒāĻžāϰ⧠3 à 2 à 1 = 6 āϰāĻāĻŽā§, āϞā§āĻāĻž āĻšāϝāĻŧ 3!, āĻĒāĻĄāĻŧāĻž āĻšāϝāĻŧ "3 factorial"āĨ¤ Nested loop āĻāĻžāĻĄāĻŧāĻž āĻāĻĻā§āϰ āϤāĻžāϞāĻŋāĻāĻž āĻŦāĻžāύāĻžāϤ⧠āĻšāϞ⧠āĻā§āϰāĻŽāĻā§āϞā§āĻā§ āϏāĻžāĻāĻžāĻ dictionary order-āĻāĨ¤ āĻĻā§āĻāĻāĻž āĻā§āϰāĻŽā§āϰ āĻāĻā§ āĻĒā§āϰāĻĨāĻŽ āĻāĻŋāύāĻŋāϏāĻāĻž āĻŽā§āϞāĻžāĻ, āϏā§āĻāĻž āϏāĻŽāĻžāύ āĻšāϞ⧠āĻĻā§āĻŦāĻŋāϤā§āϝāĻŧāĻāĻž, āĻ āĻŋāĻ āϝā§āĻāĻžāĻŦā§ āĻ āĻāĻŋāϧāĻžāύ āĻļāĻŦā§āĻĻ āϏāĻžāĻāĻžāϝāĻŧāĨ¤
next_permutation(first, last) range-āĻāĻžāĻā§ dictionary order-āĻāϰ āĻĒāϰā§āϰ āĻā§āϰāĻŽā§ āϏāĻžāĻāĻŋāϝāĻŧā§ āĻĻā§āϝāĻŧ, āĻāϰ true āĻĢā§āϰāϤ āĻĻā§āϝāĻŧāĨ¤ Range-āĻ āϝāĻĻāĻŋ āĻāĻā§ āĻĨā§āĻā§āĻ āĻļā§āώ āĻā§āϰāĻŽāĻāĻž āĻĨāĻžāĻā§, āĻŽāĻžāύ⧠āϏāĻŦāĻā§āϝāĻŧā§ āĻŦāĻĄāĻŧāĻāĻž, āϤāĻžāĻšāϞ⧠āĻ āĻĢā§āϰāϤ āĻĻā§āϝāĻŧ falseāĨ¤ āϏāĻžāĻĨā§ range-āĻāĻžāĻā§ āĻāĻŦāĻžāϰ āĻĒā§āϰāĻĨāĻŽ āĻā§āϰāĻŽā§, āĻŽāĻžāύ⧠āϏāĻŦāĻā§āϝāĻŧā§ āĻā§āĻāĻāĻžāϝāĻŧ, āĻĢāĻŋāϰāĻŋāϝāĻŧā§ āĻāύā§āĨ¤ āϤāĻžāĻ āϝ⧠loop āĻāĻā§ false āύāĻž āĻĒāĻžāĻāϝāĻŧāĻž āĻĒāϰā§āϝāύā§āϤ call āĻāϰā§, āϏā§āĻāĻž āĻĒā§āϰāϤāĻŋāĻāĻž āĻā§āϰāĻŽ āĻ āĻŋāĻ āĻāĻāĻŦāĻžāϰ āĻāϰ⧠āĻĻā§āĻā§āĨ¤
#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<int> seat{1, 2, 3};
int orders = 0;
do {
cout << seat[0] << ' ' << seat[1] << ' ' << seat[2] << '\n';
orders++;
} while (next_permutation(seat.begin(), seat.end()));
cout << orders << " orders, and seat is back to " << seat[0] << ' ' << seat[1] << ' ' << seat[2] << '\n';
return 0;
}
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
6 orders, and seat is back to 1 2 3
Loop-āĻāĻž do-while, āĻāĻžāϰāĻŖ āĻĒā§āϰāĻĨāĻŽ āĻā§āϰāĻŽ 1 2 3-āĻā§ āĻĒā§āϰāĻĨāĻŽ call āϏāϰāĻžāύā§āϰ āĻāĻā§āĻ āĻāĻžāĻā§ āϞāĻžāĻāĻžāϤ⧠āĻšāĻŦā§āĨ¤ 3 2 1-āĻāϰ āĻĒāϰ⧠call false āĻĢā§āϰāϤ āĻĻāĻŋāϝāĻŧā§āĻā§ āĻāϰ āĻĒā§āĻāύ⧠āϰā§āĻā§ āĻā§āĻā§ 1 2 3, āϤāĻžāĻ loop āĻĨāĻžāĻŽāĻžāϰ āϏāĻŽāϝāĻŧ vector āĻāĻŦāĻžāϰ āĻļā§āϰā§āϰ āĻāĻžāϝāĻŧāĻāĻžāϝāĻŧāĨ¤ āĻāĻ āĻĒāĻžāĻāĻ āϞāĻžāĻāύāĻ āĻāϞ⧠3 āĻāύ, 6 āĻāύ āĻŦāĻž n āĻāύ āĻŦāύā§āϧā§āϰ āĻāύā§āϝāĨ¤ āϤāĻžāĻ āĻā§āϝāĻŧāĻžāϰ āϝāϤāĻā§āϞā§āĻ āĻšā§āĻ, Bob-āĻāϰ nested loop-āĻāϰ āĻāĻā§āĻāϞā§āϰ āĻāĻžāϝāĻŧāĻāĻž āύā§āϝāĻŧ next_permutationāĨ¤
āĻĻā§āĻā§, next_permutation āĻā§āĻāĻžāĻŦā§ 1 2 3 āĻĒā§āϰāĻŋāϝāĻŧā§ āϝāĻžāϝāĻŧ
āĻĒā§āϰāϤāĻŋāĻāĻž call āĻāĻŽāύ āϏāĻŦāĻā§āϝāĻŧā§ āĻā§āĻ āĻŦāĻĻāϞāĻāĻž āĻāϰā§, āϝāĻžāϤ⧠āĻā§āϰāĻŽāĻāĻž āĻŦāĻĄāĻŧ āĻšāϝāĻŧ, āĻāĻžāϰāĻāĻž āĻāĻžāϞā§āĨ¤ āĻĒā§āϰāĻĨāĻŽā§ āĻā§āĻāĻā§ āĻļā§āώ rise: āϏāĻŦāĻā§āϝāĻŧā§ āĻĄāĻžāύā§āϰ position i, āϝā§āĻāĻžāύ⧠v[i] < v[i + 1]āĨ¤ āϤāĻžāϰāĻĒāϰ āĻāϰ āĻĒāϰā§āϰ element-āĻā§āϞā§āϰ āĻŽāϧā§āϝ⧠āĻā§āĻāĻā§ āϏāĻŦāĻā§āϝāĻŧā§ āĻĄāĻžāύā§āϰ āϏā§āĻāĻāĻž, āϝā§āĻāĻž v[i]-āĻāϰ āĻā§āϝāĻŧā§ āĻŦāĻĄāĻŧ, āĻāϰ āĻĻā§āĻā§āĻā§ swap āĻāϰā§āĨ¤ āĻļā§āώ⧠position i-āĻāϰ āĻĒāϰā§āϰ āϏāĻŦāĻāĻŋāĻā§ reverse āĻāϰā§āĨ¤ āĻā§āύ⧠rise-āĻ āύāĻž āĻĨāĻžāĻāϞ⧠range-āĻāĻž āϏāĻŦāĻā§āϝāĻŧā§ āĻŦāĻĄāĻŧ āĻā§āϰāĻŽ, āϤāĻžāĻ call āĻĒā§āϰ⧠range āĻāϞā§āĻā§ āĻĻā§āϝāĻŧ āĻāϰ false āĻĢā§āϰāϤ āĻĻā§āϝāĻŧāĨ¤
Widget-āĻāĻž vector<int> v{1, 2, 3}-āĻāϰ āĻāĻĒāϰ āĻāϝāĻŧāĻāĻž call āĻāĻžāϞāĻŋāϝāĻŧā§ āĻĻā§āĻāĻžāϝāĻŧ, āĻĒā§āϰāϤāĻŋ call-āĻ āĻāĻ āϏāĻžāϰāĻŋāĨ¤ āĻĒā§āϰāϤāĻŋāĻāĻž āϏāĻžāϰāĻŋ Compiler Explorer-āĻ āĻāĻāĻāĻž program print āĻāϰā§āĻā§, āϝā§āĻāĻž āĻāĻ āĻāĻžāϞāĻā§āϞ⧠āĻšāĻžāϤ⧠āĻāϰā§āĨ¤ āĻāϰ āĻĒā§āϰāϤāĻŋāĻāĻž āϏāĻžāϰāĻŋ std::next_permutation-āĻāϰ āϏāĻžāĻĨā§ āĻŽāĻŋāϞāĻŋāϝāĻŧā§ āĻĻā§āĻāĻž āĻšāϝāĻŧā§āĻā§āĨ¤ "none" āĻŽāĻžāύ⧠āĻā§āύ⧠rise āĻĒāĻžāĻāϝāĻŧāĻž āϝāĻžāϝāĻŧāύāĻŋāĨ¤
Call 2-āĻ āĻāĻžāϰāĻāĻž āĻāĻžāϞāĻ āĻĻā§āĻāĻž āϝāĻžāϝāĻŧāĨ¤ Rise-āĻāĻž 1-āĻāϰ āĻāĻžāĻā§, 1 swap āĻšāϝāĻŧ 2-āĻāϰ āϏāĻžāĻĨā§, āĻāϰ āϞā§āĻā§āϰ 3 1 āĻāϞā§āĻā§ āĻšāϝāĻŧ 1 3āĨ¤ Call 6 3 2 1-āĻ āĻā§āύ⧠rise āĻĒāĻžāϝāĻŧ āύāĻž, āϤāĻžāĻ āϏāĻŦāĻāĻŋāĻā§ āĻāϞā§āĻā§ 1 2 3 āĻŦāĻžāύāĻžāϝāĻŧ āĻāϰ false āĻĢā§āϰāϤ āĻĻā§āϝāĻŧāĨ¤ āĻāĻ āĻāĻžāϞāĻā§āϞā§āϰ āĻāύā§āϝ GCC 12-āĻāϰ āύāĻŋāĻā§āϰ code lesson 05 āĻĒāĻĄāĻŧā§ āĻĻā§āĻāĻžāĻŦā§āĨ¤ āϤāĻžāĻ āĻĒā§āϰāϤāĻŋāĻāĻž call āϝāϤāĻāĻž āĻĒāĻžāϰ⧠āĻāĻŽ āĻŦāĻĻāϞāĻžāϝāĻŧ, āĻāϰ āĻā§āϰāĻŽāĻā§āϞ⧠āĻŦā§āϰā§āϝāĻŧ āĻā§āĻ āĻĨā§āĻā§ āĻŦāĻĄāĻŧāϤā§āĨ¤
āĻĒā§āϰāĻĨāĻŽ āĻĻāĻŋāύā§āĻ āϝ⧠syntax āϞāĻžāĻāĻŦā§
āĻĒā§āϰāĻĨāĻŽ algorithm-āĻā§āϞā§, āĻāϰ āĻĒā§āϰāϤāĻŋāĻāĻž āĻā§āϰāĻŽ āĻā§āϰ⧠āĻĻā§āĻāĻžāϰ loop
#include <numeric> accumulate, and the other arithmetic algorithms
#include <algorithm> count, max_element, min_element, reverse, sort, next_permutation
accumulate(first, last, init) init plus every element; the result has init's type
count(first, last, x) how many elements equal x
max_element(first, last) an iterator to the first largest element
min_element(first, last) an iterator to the first smallest element
*it the element an iterator points at
it - v.begin() that element's index in a vector
reverse(first, last) turn the range around, in place
sort(v.begin(), v.end()); start from the smallest order
do {
... use v ...
} while (next_permutation(v.begin(), v.end())); every order once, smallest first
firstāĻāϰlastāĻšāϞ⧠iterator, āϏāĻžāϧāĻžāϰāĻŖāϤv.begin()āĻāϰv.end()āĨ¤ āϝā§āĻā§āύ⧠āĻ āĻāĻļāĻ āĻāϞā§, āϝā§āĻŽāύv.begin() + 1āĻĨā§āĻā§v.begin() + 4āĨ¤accumulate-āĻāϰ āϤā§āϤā§āϝāĻŧ argument āĻšāϞ⧠āĻļā§āϰā§āϰ āĻŽāĻžāύ, āĻāϰ āϏā§āĻāĻžāĻ āĻāϤā§āϤāϰā§āϰ type āĻ āĻŋāĻ āĻāϰā§:0āĻĻāĻŋāϞā§int,0LLāĻĻāĻŋāϞā§long long,0.0āĻĻāĻŋāϞā§doubleāĨ¤max_elementāĻāϰmin_elementāĻāĻāĻāĻž iterator āĻĢā§āϰāϤ āĻĻā§āϝāĻŧāĨ¤ āĻŽāĻžāύāĻāĻž āĻĒāĻĄāĻŧā§*itāĻĻāĻŋāϝāĻŧā§, āĻāϰ index āĻĒāĻžāĻit - v.begin()āĻĻāĻŋāϝāĻŧā§āĨ¤reverseāĻāϰnext_permutationrange-āĻāĻžāĻā§āĻ āĻŦāĻĻāϞ⧠āĻĻā§āϝāĻŧāĨ¤ āĻĒāϰā§āϰ āĻā§āϰāĻŽ āĻĨāĻžāĻāĻž āĻĒāϰā§āϝāύā§āϤnext_permutationāĻĢā§āϰāϤ āĻĻā§āϝāĻŧtrue, āĻāϰ āĻļā§āώ āĻā§āϰāĻŽā§āϰ āĻĒāϰā§falseāĨ¤
āϤāĻžāĻ āĻāĻ lesson-āĻāϰ āĻāύā§āϝ āϞāĻžāĻā§ āĻĻā§āĻāĻāĻž header āĻāϰ āϏāĻžāϤāĻāĻž call, āĻāϰ āĻĒā§āϰāϤāĻŋāĻāĻž call range āύā§āϝāĻŧ āĻāĻāĻ āĻāĻžāĻŦā§āĨ¤
āĻāĻā§ sort āĻāϰā§, āύāĻāϞ⧠āĻā§āϰāĻŽ āĻŦāĻžāĻĻ āĻĒāĻĄāĻŧāĻŦā§
next_permutation dictionary order-āĻ āĻļā§āϧ⧠āϏāĻžāĻŽāύā§āϰ āĻĻāĻŋāĻā§ āϝāĻžāϝāĻŧāĨ¤ āĻŽāĻžāĻāĻāĻžāύ āĻĨā§āĻā§ āĻļā§āϰ⧠āĻāϰāϞ⧠āĻļā§āϰā§āϰ āĻāĻā§āϰ āĻā§āϰāĻŽāĻā§āϞā§āϤ⧠āĻ āĻāĻāύ⧠āϝāĻžāϝāĻŧ āύāĻžāĨ¤ āĻāĻ program 2 1 3 āĻĨā§āĻā§ āĻā§āϰāĻŽ āĻā§āύā§, āϤāĻžāϰāĻĒāϰ sort āĻāϰ⧠āĻāĻŦāĻžāϰ āĻā§āύā§āĨ¤
#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;
int countOrders(vector<int> v) {
int orders = 0;
do {
orders++;
} while (next_permutation(v.begin(), v.end()));
return orders;
}
int main() {
vector<int> friends{2, 1, 3};
cout << "from 2 1 3: " << countOrders(friends) << " orders\n";
sort(friends.begin(), friends.end());
cout << "from 1 2 3: " << countOrders(friends) << " orders\n";
return 0;
}
from 2 1 3: 4 orders
from 1 2 3: 6 orders
2 1 3 āĻĨā§āĻā§ loop āĻĻā§āĻā§āĻā§ 2 1 3, 2 3 1, 3 1 2 āĻāϰ 3 2 1: āĻāϝāĻŧāĻāĻžāϰ āĻŽāϧā§āϝ⧠āĻāĻžāϰāĻāĻžāĨ¤ āĻļā§āϰā§āϰ āĻāĻā§āϰ āĻĻā§āĻāĻāĻž āĻā§āϰāĻŽ, 1 2 3 āĻāϰ 1 3 2, āĻāĻāύ⧠āĻāϏā§āύāĻŋāĨ¤ sort-āĻāϰ āĻĒāϰ⧠āĻāϝāĻŧāĻāĻžāĻ āĻŦā§āϰāĻŋāϝāĻŧā§āĻā§āĨ¤ āĻā§āύ⧠āĻŽāĻžāύ āĻĻā§āĻāĻŦāĻžāϰ āĻĨāĻžāĻāϞ⧠āĻĒā§āϰāϤāĻŋāĻāĻž āĻāϞāĻžāĻĻāĻž āĻā§āϰāĻŽ āĻāϏ⧠āĻāĻāĻŦāĻžāϰ āĻāϰā§: 1 1 2 āĻĨā§āĻā§ āĻāϏ⧠āϤāĻŋāύāĻāĻž āĻā§āϰāĻŽ, āĻāϝāĻŧāĻāĻž āύāĻž, āĻāϰ lesson 02 āϏā§āĻāĻž āϧāĻžāĻĒā§ āϧāĻžāĻĒā§ āĻĻā§āĻāĻžāĻŦā§āĨ¤ āϤāĻžāĻ āĻĒā§āϰāϤāĻŋāĻŦāĻžāϰ āĻāĻā§ sort āĻāϰā§āĨ¤
āĻļā§āϰā§āϰ āĻŽāĻžāύāĻ type āĻ āĻŋāĻ āĻāϰā§
accumulate āĻāϞāϤāĻŋ āϝā§āĻāĻĢāϞāĻāĻž āϰāĻžāĻā§ āĻļā§āϰā§āϰ āĻŽāĻžāύā§āϰ type-āĻ, element-āĻāϰ type-āĻ āύāĻžāĨ¤ āĻāĻāĻž āĻĻā§āĻ āĻĻāĻŋāĻā§āĻ āĻāĻžāĻŽā§āϞāĻž āĻāϰā§: āĻŦāĻĄāĻŧ āϝā§āĻāĻĢāϞā§, āĻāϰ āĻāĻā§āύāĻžāĻāĻļā§āĨ¤
#include <iostream>
#include <numeric>
#include <vector>
using namespace std;
int main() {
vector<int> steps(100000, 100000);
cout << accumulate(steps.begin(), steps.end(), 0) << '\n';
cout << accumulate(steps.begin(), steps.end(), 0LL) << '\n';
vector<double> prices{1.5, 2.5, 3.5};
cout << accumulate(prices.begin(), prices.end(), 0) << '\n';
cout << accumulate(prices.begin(), prices.end(), 0.0) << '\n';
return 0;
}
1410065408
10000000000
6
7.5
100000 āĻĻāĻŋāύ āϧāϰ⧠āϰā§āĻ 100000 āĻĒāĻž āĻšāĻžāĻāĻāϞ⧠āĻšāϝāĻŧ 10000000000, āϝā§āĻāĻž āϏāĻŦāĻā§āϝāĻŧā§ āĻŦāĻĄāĻŧ int 2147483647-āĻāϰ āĻ
āύā§āĻ āĻāĻĒāϰā§āĨ¤ 0 āĻĻāĻŋāϞ⧠āϝā§āĻāĻĢāϞāĻāĻž int, āϤāĻžāĻ āĻāĻāĻž āĻā§āϰ⧠āĻā§āĻā§, āĻāϰ GCC 12 print āĻāϰā§āĻā§ 1410065408āĨ¤ Signed overflow āĻšāϞ⧠undefined behaviour, āϤāĻžāĻ āĻāĻ āϏāĻāĻā§āϝāĻžāĻāĻž āĻāĻ compiler āϝāĻž āĻāϰā§āĻā§ āϤāĻž, āĻā§āύ⧠āĻāĻĨāĻž āĻĻā§āĻāϝāĻŧāĻž āĻĢāϞ āύāĻž; āϏāĻāĻā§āϝāĻžāĻāĻž āĻā§āĻĨāĻž āĻĨā§āĻā§ āĻāϏā§, lesson 05 āĻŦāϞāĻŦā§āĨ¤ 0LL āĻĻāĻŋāϞ⧠āϝā§āĻāĻĢāϞ long long, āĻāϰ āĻāϤā§āϤāϰ āĻ āĻŋāĻāĨ¤
āĻĻāĻžāĻŽāĻā§āϞ⧠āϝā§āĻ āĻāϰāϞ⧠āĻšāϝāĻŧ 7.5, āĻāĻŋāύā§āϤ⧠0 āĻāĻŦāĻžāϰ āϝā§āĻāĻĢāϞāĻā§ int āĻŦāĻžāύāĻŋāϝāĻŧā§ āĻĻāĻŋāϝāĻŧā§āĻā§āĨ¤ āĻĒā§āϰāϤāĻŋāĻāĻž āϧāĻžāĻĒā§ āĻāĻā§āύāĻžāĻāĻļāĻāĻž āĻā§āĻā§ āĻĒā§āϰā§āĻŖāϏāĻāĻā§āϝāĻž āĻšāϝāĻŧā§ āĻā§āĻā§: 0 + 1.5 āĻšāϞ⧠1, āϤāĻžāϰāĻĒāϰ 3.5 āĻšāϞ⧠3, āϤāĻžāϰāĻĒāϰ 6.5 āĻšāϞ⧠6āĨ¤ 0.0 āĻĻāĻŋāϞ⧠āϝā§āĻāĻĢāϞ doubleāĨ¤ āϤāĻžāĻ āϝ⧠type-āĻ āĻāϤā§āϤāϰ āĻāĻžāĻ, āĻļā§āϰā§āϰ āĻŽāĻžāύāĻāĻž āϏā§āĻ type-āĻ āϞā§āĻā§āĨ¤
| āĻļā§āϰā§āϰ āĻŽāĻžāύ | āϝā§āĻāĻĢāϞ āĻĨāĻžāĻā§ | āĻāĻāύ āύā§āĻŦā§ |
|---|---|---|
0 | int | āĻĒā§āϰā§āĻŖāϏāĻāĻā§āϝāĻžāϰ āĻā§āĻ āϝā§āĻāĻĢāϞ |
0LL | long long | āϝ⧠āϝā§āĻāĻĢāϞ 2147483647 āĻĒā§āϰā§āϤ⧠āĻĒāĻžāϰ⧠|
0.0 | double | āĻĻāĻžāĻŽ, āĻāĻĄāĻŧ, āĻāĻā§āύāĻžāĻāĻļ āĻāĻā§ āĻāĻŽāύ āϝā§āĻā§āύ⧠āĻāĻŋāĻā§ |
āĻĒā§āϰāϤāĻŋāĻāĻž call-āĻāϰ āĻāϰāĻ āĻāϤ
accumulate, count, max_element āĻāϰ min_element āĻĒā§āϰāϤāĻŋāĻāĻž element āĻāĻāĻŦāĻžāϰ āĻāϰ⧠āĻĻā§āĻā§: n-āĻāĻž element-āĻ n āϧāĻžāĻĒ, O(n)āĨ¤ reverse āĻāϰ⧠n / 2-āĻāĻž swap, āϏā§āĻāĻžāĻ O(n)āĨ¤ āĻāĻāĻ āĻāĻžāĻā§āϰ āĻšāĻžāϤ⧠āϞā§āĻāĻž loop-āĻāϰ āĻāϰāĻāĻ āĻāĻ, āϤāĻžāĻ call āĻāĻāύ⧠āϧā§āϰ āĻĒāĻĨ āύāĻžāĨ¤
next_permutation-āĻāϰ āĻāĻāĻāĻž call worst case-āĻ O(n), āϝāĻāύ āĻĒā§āϰ⧠range āĻāϞā§āĻāĻžāϤ⧠āĻšāϝāĻŧ, āϝā§āĻŽāύ call 6-āĻ āĻšāϞā§āĨ¤ āϤāĻŦā§ āϏāĻŦ āĻā§āϰāĻŽ āĻŽāĻŋāϞāĻŋāϝāĻŧā§ āĻāĻĄāĻŧā§ āĻāĻāĻāĻž call-āĻ āϞāĻžāĻā§ āĻŽā§āĻāĻžāĻŽā§āĻāĻŋ 3āĻāĻž āϤā§āϞāύāĻž: n = 3-āĻ 2.5, n = 10-āĻ 3.08, Compiler Explorer-āĻ āĻā§āύ⧠āĻĻā§āĻāĻžāĨ¤ āĻāϏāϞ āĻāϰāĻ āĻšāϞ⧠āĻā§āϰāĻŽā§āϰ āϏāĻāĻā§āϝāĻžāĨ¤ n-āĻāĻž āĻāĻŋāύāĻŋāϏā§āϰ āĻā§āϰāĻŽ n!-āĻāĻž, āĻāϰ āĻĒā§āϰāϤāĻŋāĻāĻž āĻŦāĻžāĻĄāĻŧāϤāĻŋ āĻāĻŋāύāĻŋāϏ āϏāĻāĻā§āϝāĻžāĻāĻžāĻā§ āĻā§āĻŖ āĻāϰ⧠āĻŦāĻžāĻĄāĻŧāĻžāϝāĻŧāĨ¤ āĻāĻ program 8 āĻĨā§āĻā§ 11āĻāĻž āĻāĻŋāύāĻŋāϏā§āϰ āĻĒā§āϰ⧠do-while-āĻāϰ āϏāĻŽāϝāĻŧ āĻŽāĻžāĻĒā§āĨ¤
#include <algorithm>
#include <chrono>
#include <iostream>
#include <numeric>
#include <vector>
using namespace std;
int main() {
for (int n = 8; n <= 11; n++) {
vector<int> v(n);
iota(v.begin(), v.end(), 1);
auto t0 = chrono::steady_clock::now();
long long count = 0, check = 0;
do {
count++;
check += v[0];
} while (next_permutation(v.begin(), v.end()));
auto t1 = chrono::steady_clock::now();
cout << n << ": " << count << " orders, " << chrono::duration<double, milli>(t1 - t0).count() << " ms (" << check << ")\n";
}
return 0;
}
| n | āĻā§āϰāĻŽ, n! | āϏāĻŦāĻā§āϞā§āϰ āϏāĻŽāϝāĻŧ |
|---|---|---|
| 8 | 40320 | 0.082 āĻĨā§āĻā§ 0.21 ms |
| 9 | 362880 | 0.75 āĻĨā§āĻā§ 2.88 ms |
| 10 | 3628800 | 7.4 āĻĨā§āĻā§ 16.8 ms |
| 11 | 39916800 | 81 āĻĨā§āĻā§ 189 ms |
Compiler Explorer-āĻāϰ GCC 12.2-āĻ -O2 -std=c++17 āĻĻāĻŋāϝāĻŧā§ āĻāĻāĻžāϰā§āĻŦāĻžāϰ āĻāĻžāϞāĻžāύā§, āĻĒā§āϰāϤāĻŋāĻŦāĻžāϰ āĻāϞāĻžāĻĻāĻž āĻāĻāĻāĻž comment āĻĻāĻŋāϝāĻŧā§, āϝāĻžāϤ⧠āĻāĻŋāĻā§āĻ cache āĻĨā§āĻā§ āύāĻž āĻāϏā§āĨ¤ āĻāĻāĻ input āĻā§āύ⧠run-āĻ āĻ
āύā§āϝ run-āĻāϰ āĻā§āϝāĻŧā§ 2 āĻĨā§āĻā§ 3 āĻā§āĻŖ āϧā§āϰ āĻāϞā§āĻā§, āϤāĻžāĻ āĻĒā§āϰāϤāĻŋāĻāĻž āϏāĻžāϰāĻŋāĻā§ āĻāĻāĻāĻž range āĻšāĻŋāϏā§āĻŦā§ āĻĒāĻĄāĻŧā§āĨ¤ āĻĒā§āϰāϤāĻŋ āϧāĻžāĻĒā§ āϏāĻŽāϝāĻŧ āĻŽā§āĻāĻžāĻŽā§āĻāĻŋ n āĻā§āĻŖ āĻŦāĻžāĻĄāĻŧā§, n! āϝā§āĻŽāύ āĻŦāϞā§āĨ¤ 12āĻāĻž āĻāĻŋāύāĻŋāϏ āĻŽāĻžāύ⧠479001600āĻāĻž āĻā§āϰāĻŽ, 11āĻāĻžāϰ āϏāĻŽāϝāĻŧā§āϰ āĻŽā§āĻāĻžāĻŽā§āĻāĻŋ 12 āĻā§āĻŖāĨ¤ āϤāĻžāĻ 10 āĻŦāĻž 11āĻāĻž āĻāĻŋāύāĻŋāϏ āĻĒāϰā§āϝāύā§āϤ āĻĒā§āϰāϤāĻŋāĻāĻž āĻā§āϰāĻŽ āĻā§āϰ⧠āĻĻā§āĻāĻž āĻāϞā§, āĻāϰ loop-āĻāϰ āĻāĻŋāϤāϰā§āϰ āĻāϏāϞ āĻāĻžāĻ āĻāϰ āϏāĻžāĻĨā§ āϝā§āĻ āĻšāϝāĻŧāĨ¤
āϏāĻŦāĻā§āϝāĻŧā§ āĻā§āĻ program: āĻŦāĻŋāĻā§āϰāĻŋāϰ āĻāĻāĻāĻž āĻŦāĻžāĻāϧāĻž āϤāĻžāϞāĻŋāĻāĻž, āĻāϰ āĻŽā§āĻ, āϏāĻŦāĻā§āϝāĻŧā§ āĻŦāĻĄāĻŧ āĻŦāĻŋāĻā§āϰāĻŋ, āĻāϰ āĻ āĻŋāĻ 45-āĻāϰ āĻŦāĻŋāĻā§āϰāĻŋ āĻāϝāĻŧāĻāĻžāĨ¤
#include <algorithm>
#include <iostream>
#include <numeric>
#include <vector>
using namespace std;
int main() {
vector<int> sales{120, 45, 300, 45, 80};
cout << "total: " << accumulate(sales.begin(), sales.end(), 0) << '\n';
cout << "largest: " << *max_element(sales.begin(), sales.end()) << '\n';
cout << "sales of 45: " << count(sales.begin(), sales.end(), 45) << '\n';
return 0;
}
total: 590
largest: 300
sales of 45: 2
āϤāĻŋāύāĻāĻž āĻĒā§āϰāĻļā§āύ, āϤāĻŋāύāĻāĻž call, āĻāϰ āĻā§āĻĨāĻžāĻ āĻāĻāĻāĻžāĻ index āύā§āĻāĨ¤ 45-āĻāϰ āĻĻā§āĻāĻāĻž āĻŦāĻŋāĻā§āϰāĻŋāĻ āĻā§āύāĻž āĻšāϝāĻŧā§āĻā§, āϝā§āĻāĻžāύā§āĻ āĻŦāϏ⧠āĻĨāĻžāĻā§āĻāĨ¤
Run in CompilerKenji-āϰ āϏāĻžāĻāĻā§āϞā§āϰ āϤāĻžāϞāĻžāϝāĻŧ āϤāĻŋāύāĻāĻž āĻāĻžāĻāϤāĻŋ, āĻāϰ āĻāϰ āĻŽāύ⧠āĻāĻā§ āĻ
āĻā§āĻāĻā§āϞ⧠3, 5 āĻāϰ 8, āĻāĻŋāύā§āϤ⧠āĻā§āϰāĻŽāĻāĻž āύāĻžāĨ¤ āϏ⧠dictionary order-āĻ code āĻā§āώā§āĻāĻž āĻāϰā§, āϝāϤāĻā§āώāĻŖ āύāĻž āϤāĻžāϞāĻž āĻā§āϞā§āĨ¤ Program-āĻāĻž āϤāĻžāϞāĻžāϰ āĻā§āĻŽāĻŋāĻāĻžāĻ āύā§āϝāĻŧ, āϤāĻžāĻ āĻā§āĻĒāύ code-āĻāĻž āĻ āĻāĻžāύā§; Kenji āĻāĻžāύ⧠āύāĻžāĨ¤ āĻāĻāĻāĻž string āĻšāϞ⧠character-āĻāϰ āĻāĻāĻāĻž range, āϤāĻžāĻ sort āĻāϰ next_permutation āϏāϰāĻžāϏāϰāĻŋ āĻāϰ āĻāĻĒāϰ āĻāϞā§āĨ¤
#include <algorithm>
#include <iostream>
#include <string>
using namespace std;
int main() {
string secret = "853"; // the lock knows it; Kenji does not
string code = "583"; // the three digits, in the order Kenji remembers
sort(code.begin(), code.end());
int tries = 0;
do {
tries++;
cout << "try " << tries << ": " << code << '\n';
if (code == secret) {
break;
}
} while (next_permutation(code.begin(), code.end()));
cout << "open after " << tries << " tries\n";
return 0;
}
try 1: 358
try 2: 385
try 3: 538
try 4: 583
try 5: 835
try 6: 853
open after 6 tries
Sort 583-āĻā§ āĻŦāĻžāύāĻŋāϝāĻŧā§āĻā§ 358, āϏāĻŦāĻā§āϝāĻŧā§ āĻā§āĻ code, āϤāĻžāĻ āĻā§āύ⧠code āĻŦāĻžāĻĻ āĻĒāĻĄāĻŧā§āύāĻŋāĨ¤ āϤāĻžāϞāĻž āĻā§āϞāĻžāϰ āϏāĻžāĻĨā§ āϏāĻžāĻĨā§ break do-while āĻĨā§āĻā§ āĻŦā§āϰāĻŋāϝāĻŧā§ āĻāϏā§, āĻāĻāĻžāύ⧠āώāώā§āĻ āĻāϰ āĻļā§āώ āĻā§āώā§āĻāĻžāϝāĻŧāĨ¤ āϤāĻŋāύāĻāĻž āĻ
āĻā§āĻā§ āĻŦāĻĄāĻŧāĻā§āϰ 3! = 6 āĻŦāĻžāϰ āĻā§āώā§āĻāĻž āϞāĻžāĻā§āĨ¤
Amara āύāĻžāĻŽāĻā§āϞ⧠āϰāĻžāĻā§ āĻāĻāĻāĻž vector-āĻ, āĻāϰ āύāĻŽā§āĻŦāϰāĻā§āϞ⧠āĻāϰā§āĻāĻāĻžāϝāĻŧ, āĻāĻāĻ āĻā§āϰāĻŽā§āĨ¤ max_element āϏāĻŦāĻā§āϝāĻŧā§ āĻŦā§āĻļāĻŋ āύāĻŽā§āĻŦāϰā§āϰ āĻĻāĻŋāĻā§ āĻāĻāĻāĻž iterator āĻĻā§āϝāĻŧ, āĻāϰ āϤāĻž āĻĨā§āĻā§ score.begin() āĻŦāĻŋāϝāĻŧā§āĻ āĻāϰāϞ⧠āĻĒāĻžāĻāϝāĻŧāĻž āϝāĻžāϝāĻŧ indexāĨ¤ āϏā§āĻ index āĻĻāĻŋāϝāĻŧā§āĻ āύāĻžāĻŽāĻāĻž āĻĒāĻĄāĻŧāĻž āĻšāϝāĻŧāĨ¤
#include <algorithm>
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int main() {
vector<string> names{"alice", "bob", "david", "zara"};
vector<int> score{72, 91, 85, 91};
auto best = max_element(score.begin(), score.end());
int at = best - score.begin();
cout << "top score " << *best << " at index " << at << ": " << names[at] << '\n';
return 0;
}
top score 91 at index 1: bob
Bob āĻāϰ Zara āĻĻā§āĻāύā§āĻ āĻĒā§āϝāĻŧā§āĻā§ 91, āĻāϰ max_element āĻĢā§āϰāϤ āĻĻāĻŋāϝāĻŧā§āĻā§ āĻĒā§āϰāĻĨāĻŽāĻāύāĻā§, index 1-āĻāϰ Bob-āĻā§āĨ¤ āϤāĻžāĻ āϏāĻŦāĻā§āϝāĻŧā§ āĻŦāĻĄāĻŧ āĻŽāĻžāύ⧠āĻĻā§āĻāĻāĻž element āϏāĻŽāĻžāύ āĻšāϞ⧠max_element āĻĻā§āĻāĻžāϝāĻŧ āϏāĻžāĻŽāύā§āϰ āĻĻāĻŋāĻā§āϰāĻāĻžāĻā§āĨ¤ Amara āĻāϏāϞ⧠āĻ āĻŋāĻ āĻāĻ program-āĻāĻžāĻ āϞāĻŋāĻāϤāĨ¤
āĻāĻāĻž āĻā§āĻĨāĻžāϝāĻŧ āĻāĻžāĻā§ āϞāĻžāĻā§
- Python-āĻāϰ
itertools.permutations. āĻāϰ documentation āĻŦāϞā§, āĻā§āϰāĻŽāĻā§āϞ⧠āĻŦā§āϰā§āϝāĻŧ lexicographic order-āĻ, input āϝ⧠āĻā§āϰāĻŽā§ āĻāĻā§ āϏā§āĻāĻž āϧāϰā§āĨ¤ āϤāĻžāĻ sort āĻāϰāĻž input āĻĻāĻŋāϞ⧠output-āĻ āĻāϏ⧠āϏāĻžāĻāĻžāύā§: āĻāĻāĻ "āĻāĻā§ sort" āύāĻŋāϝāĻŧāĻŽāĨ¤ āϤāĻŦā§next_permutation-āĻāϰ āĻŽāϤ⧠āύāĻž, āĻ element-āĻā§āϞā§āĻā§ āĻāϞāĻžāĻĻāĻž āϧāϰ⧠āĻāĻĻā§āϰ position āĻĻāĻŋāϝāĻŧā§, āϤāĻžāĻ āĻāĻāĻ āĻŽāĻžāύ āĻĻā§āĻāĻŦāĻžāϰ āĻĨāĻžāĻāϞ⧠āĻāĻāĻ āĻā§āϰāĻŽāĻ āĻĻā§āĻāĻŦāĻžāϰ āĻāϏā§āĨ¤ - Java-āϰ
java.util.Collections. āĻāϰmax,min,reverseāĻāϰfrequencyāĻ āĻŋāĻmax_element,min_element,reverseāĻāϰcount-āĻāϰ āĻāĻžāĻāĻā§āϞ⧠āĻāϰā§āĨ¤ āĻāĻāĻāĻž āϤāĻĢāĻžāϤ āĻāĻā§: āĻāĻžāϞāĻŋ collection āĻĒā§āϞā§Collections.maxNoSuchElementExceptionāĻā§āĻĄāĻŧā§ āĻĻā§āϝāĻŧ, āϝā§āĻāĻžāύā§max_elementāĻā§āĻĒāĻāĻžāĻĒend()āĻĢā§āϰāϤ āĻĻā§āϝāĻŧāĨ¤ - NumPy-āϰ
argmax.np.argmaxāĻāĻāĻāĻž array-āϰ āϏāĻŦāĻā§āϝāĻŧā§ āĻŦāĻĄāĻŧ āĻŽāĻžāύā§āϰ index āĻĢā§āϰāϤ āĻĻā§āϝāĻŧ, āϝā§āĻŽāύ āĻāĻāĻžāύā§max_elementāĻĨā§āĻā§begin()āĻŦāĻŋāϝāĻŧā§āĻ āĻāϰāϞ⧠āĻĒāĻžāĻāϝāĻŧāĻž āϝāĻžāϝāĻŧāĨ¤ āĻāϰ documentation āĻŦāϞā§, āϏāĻŦāĻā§āϝāĻŧā§ āĻŦāĻĄāĻŧ āĻŽāĻžāύ āĻāĻāĻžāϧāĻŋāĻāĻŦāĻžāϰ āĻĨāĻžāĻāϞ⧠āĻĒā§āϰāĻĨāĻŽ index-āĻāĻžāĻ āĻĢā§āϰāϤ āĻāϏā§, āĻāĻāĻ āύāĻŋāϝāĻŧāĻŽāĨ¤
āϝ⧠āĻā§āϞāĻā§āϞ⧠āϏāĻŦāĻžāĻ āĻāϰā§
ā§§. <numeric> āϞāĻŋāĻāϤ⧠āĻā§āϞ⧠āϝāĻžāĻāϝāĻŧāĻžāĨ¤
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<int> v{1, 2, 3};
cout << accumulate(v.begin(), v.end(), 0) << '\n';
return 0;
}
Runner-āĻāϰ flag-āĻ error: error: 'accumulate' was not declared in this scope, āĻāϰ āĻāĻŋāĻā§ āύāĻžāĨ¤ map-āĻāϰ āĻŦā§āϞāĻžāϝāĻŧ GCC 12 āϝā§āĻŽāύ "did you forget to #include" note āĻĻā§āϝāĻŧ, accumulate-āĻāϰ āĻŦā§āϞāĻžāϝāĻŧ āĻĻā§āϝāĻŧ āύāĻž, āϤāĻžāĻ message header-āĻāϰ āύāĻžāĻŽāĻ āĻŦāϞ⧠āύāĻžāĨ¤ #include <numeric> āϝā§āĻ āĻāϰā§āĨ¤ āϤā§āĻŽāĻŋ āĻāĻāĻž āĻā§āϞāĻŦā§, āĻāĻžāϰāĻŖ āĻŽāύ⧠āĻšāϝāĻŧ accumulate-āĻ sort-āĻāϰ āϏāĻžāĻĨā§ <algorithm>-āĻāĻ āĻĨāĻžāĻāĻžāϰ āĻāĻĨāĻžāĨ¤
⧍. <algorithm> āϞāĻŋāĻāϤ⧠āĻā§āϞ⧠āϝāĻžāĻāϝāĻŧāĻžāĨ¤
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<int> v{3, 1, 2};
cout << *max_element(v.begin(), v.end()) << '\n';
reverse(v.begin(), v.end());
return 0;
}
Runner-āĻāϰ flag-āĻ āĻĻā§āĻāĻāĻž error: error: 'max_element' was not declared in this scope āĻāϰ error: 'reverse' was not declared in this scope, āĻāĻŦāĻžāϰāĻ āĻā§āύ⧠note āĻāĻžāĻĄāĻŧāĻžāĨ¤ āĻāĻāĻāĻž header āύā§āĻ, āϤāĻžāĻ āĻĒā§āϰāϤāĻŋāĻāĻž call-āĻāϰ āĻāύā§āϝ āĻāĻāĻāĻž āĻāϰ⧠errorāĨ¤ āĻā§āĻ program-āĻ āϤā§āĻŽāĻŋ āĻāĻāĻž āĻā§āϞāĻŦā§, āϝā§āĻāĻžāύ⧠<iostream> āĻāϰ <vector>-āĻ āϝāĻĨā§āώā§āĻ āĻŽāύ⧠āĻšāϝāĻŧāĨ¤
ā§Š. āϏāĻžāĻāĻžāύ⧠āύāĻž āĻāĻŽāύ āĻā§āϰāĻŽ āĻĨā§āĻā§ next_permutation āĻļā§āϰ⧠āĻāϰāĻžāĨ¤
vector<int> friends{2, 1, 3};
int orders = 0;
do {
orders++;
} while (next_permutation(friends.begin(), friends.end()));
cout << orders << '\n';
āĻā§āύ⧠message āύā§āĻ, āĻāϰ print āĻšāϝāĻŧ 4, 6 āύāĻž: 1 2 3 āĻāϰ 1 3 2 āĻļā§āϰā§āϰ āĻāĻā§ āĻĒāĻĄāĻŧā§, āϤāĻžāĻ āĻāĻāύ⧠āĻāϏ⧠āύāĻžāĨ¤ Loop-āĻāϰ āĻāĻā§ sort(friends.begin(), friends.end()) call āĻāϰā§āĨ¤ āϤā§āĻŽāĻŋ sort āĻŦāĻžāĻĻ āĻĻā§āĻŦā§, āĻāĻžāϰāĻŖ āύāĻŋāĻā§āϰ āϞā§āĻāĻž vector-āĻāĻžāĻā§ āĻŽāύ⧠āĻšāϝāĻŧ "āϏāĻŦ āĻŦāύā§āϧ⧠āϤ⧠āĻāĻā§āĻ", āĻā§āϰāĻŽā§ āĻā§ āĻāϏ⧠āϝāĻžāϝāĻŧāĨ¤
ā§Ē. 0 āĻĻāĻŋāϝāĻŧā§ āĻļā§āϰ⧠āĻāϰ⧠double āϝā§āĻ āĻāϰāĻžāĨ¤
vector<double> prices{1.5, 2.5, 3.5};
cout << accumulate(prices.begin(), prices.end(), 0) << '\n';
Runner-āĻāϰ flag-āĻ āĻā§āύ⧠message āύā§āĻ, āĻāϰ print āĻšāϝāĻŧ 6, 7.5 āύāĻžāĨ¤ āĻļā§āϰā§āϰ āĻŽāĻžāύ 0 āĻāĻāĻāĻž int, āϤāĻžāĻ āĻĒā§āϰāϤāĻŋāĻāĻž āϧāĻžāĻĒ āĻā§āĻā§ āĻĒā§āϰā§āĻŖāϏāĻāĻā§āϝāĻž āĻšāϝāĻŧā§ āϝāĻžāϝāĻŧāĨ¤ 0.0 āϞā§āĻā§āĨ¤ āϤā§āĻŽāĻŋ 0 āϞāĻŋāĻāĻŦā§, āĻāĻžāϰāĻŖ āĻā§āĻŦāύ⧠āϝāϤ āϝā§āĻāĻĢāϞ āϞāĻŋāĻā§āĻ, āϏāĻŦāĻ āĻāĻāĻžāĻŦā§ āĻļā§āϰ⧠āĻšāϝāĻŧā§āĻā§āĨ¤
Zara āĻāϰ āĻā§āĻ āĻāĻžāĻāϝāĻŧā§āϰ āĻāύā§āϝ āĻ āĻā§āώāϰā§āϰ āĻāĻžāĻāϞā§āϰ āĻāĻāĻāĻž āĻŦāĻžāĻā§āϏ āĻĨā§āĻā§ āĻļāĻŦā§āĻĻā§āϰ āĻāĻžāϰā§āĻĄ āĻŦāĻžāύāĻžāϝāĻŧāĨ¤ āĻāĻāĻāĻž āĻļāĻŦā§āĻĻā§āϰ āĻāĻžāĻāϞāĻā§āϞ⧠āϏ⧠āϏāĻŽā§āĻāĻžāĻŦā§āϝ āĻĒā§āϰāϤāĻŋāĻāĻž āĻā§āϰāĻŽā§ āĻŦāϏāĻžāϝāĻŧ, āĻāϰ āϝāϤ āĻļāĻŦā§āĻĻ āĻŦāĻžāύāĻžāύ⧠āϝāĻžāϝāĻŧ, āϏāĻŦ āϞāĻŋāĻā§ āϰāĻžāĻā§āĨ¤ āĻĻā§āĻāĻāĻž āĻā§āϰāĻŽ āĻāĻāĻ āĻļāĻŦā§āĻĻ āĻŦāĻžāύāĻžāϞ⧠āϏā§āĻāĻž āĻā§āύāĻž āĻšāϝāĻŧ āĻāĻāĻŦāĻžāϰāĨ¤ āϤāĻžāϞāĻŋāĻāĻžāĻāĻž āϏ⧠āĻāĻžāϝāĻŧ dictionary order-āĻ, āĻāϰ āϏāĻŦāĻžāϰ āĻāĻā§ āϤāĻžāϞāĻŋāĻāĻžāϰ āĻĻā§āϰā§āĻā§āϝāĨ¤
Input. āĻāĻ āϞāĻžāĻāύ: 1 āĻĨā§āĻā§ 8āĻāĻž āĻā§āĻ āĻšāĻžāϤā§āϰ āĻāĻāϰā§āĻāĻŋ āĻ āĻā§āώāϰā§āϰ āĻāĻāĻāĻž āĻļāĻŦā§āĻĻ sāĨ¤
Output. āĻāϞāĻžāĻĻāĻž āĻāϞāĻžāĻĻāĻž āĻļāĻŦā§āĻĻā§āϰ āϏāĻāĻā§āϝāĻž k, āϤāĻžāϰāĻĒāϰ k-āĻāĻž āĻļāĻŦā§āĻĻ, āĻĒā§āϰāϤāĻŋ āϞāĻžāĻāύ⧠āĻāĻāĻāĻž, dictionary order-āĻāĨ¤
Constraints. s-āĻ 1 āĻĨā§āĻā§ 8āĻāĻž āĻ
āĻā§āώāϰ, āĻĒā§āϰāϤāĻŋāĻāĻž a āĻĨā§āĻā§ z-āĻāϰ āĻŽāϧā§āϝā§āĨ¤
Sample. Input bba āĻĻāĻŋāϞ⧠3, āϤāĻžāϰāĻĒāϰ abb, bab āĻāϰ bbaāĨ¤ āĻĻā§āĻāĻāĻž b āĻāĻžāĻāϞ āĻ
āĻĻāϞāĻŦāĻĻāϞ āĻāϰāϞā§āĻ āĻāĻāĻ āĻļāĻŦā§āĻĻ āĻšāϝāĻŧ, āϤāĻžāĻ āϏā§āĻāĻž āĻā§āύāĻž āĻšāϝāĻŧ āĻāĻāĻŦāĻžāϰāĨ¤
#include <algorithm>
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
string s;
cin >> s;
vector<string> words; // every different word, in dictionary order
// Visit every arrangement of the letters of s with next_permutation,
// and add each one to words.
cout << words.size() << '\n';
for (const string& w : words) {
cout << w << '\n';
}
return 0;
}
letter-orders āύāĻžāĻŽā§ grade āĻšāϝāĻŧāĨ¤ āĻāĻāĻž āĻāĻ module-āĻāϰ problem set-āĻāϰ āĻāĻāĻāĻž free problemāĨ¤ Hidden test-āĻ āĻāĻā§ āĻāĻāĻāĻžāĻŽāĻžāϤā§āϰ āĻ
āĻā§āώāϰ, āĻāĻāĻāĻž āĻāĻāĻ āĻ
āĻā§āώāϰ, āĻāϰ āĻāĻāĻāĻž āĻāϞāĻžāĻĻāĻž āĻ
āĻā§āώāϰ (40320āĻāĻž āĻļāĻŦā§āĻĻ)āĨ¤ āĻāϰāĻ āĻāĻā§ āĻāϞā§āĻā§ āĻā§āϰāĻŽā§ āĻāĻžāĻāĻĒ āĻāϰāĻž āĻ
āĻā§āώāϰ, āĻāϰ āĻāĻāĻ āĻ
āĻā§āώāϰ āĻāĻāĻžāϧāĻŋāĻāĻŦāĻžāϰ āĻāĻā§ āĻāĻŽāύ āĻļāĻŦā§āĻĻāĨ¤
Zara āĻāϝāĻŧāύāĻž-āĻļāĻŦā§āĻĻ āĻāĻŽāĻžāϝāĻŧ, āĻŽāĻžāύ⧠āĻāĻŽāύ āĻļāĻŦā§āĻĻ āϝā§āĻāĻž āĻāϞā§āĻā§ āĻĻāĻŋāĻ āĻĨā§āĻā§ āĻĒāĻĄāĻŧāϞā§āĻ āĻāĻāĻ āĻĨāĻžāĻā§, āϝā§āĻŽāύ level āĻāϰ noonāĨ¤ āĻāϰ āĻāĻžāĻā§ āĻļāĻŦā§āĻĻā§āϰ āĻāĻāĻāĻž āϤāĻžāϞāĻŋāĻāĻž āĻāĻā§, āĻāϰ āϏ⧠āĻāĻžāύāϤ⧠āĻāĻžāϝāĻŧ āϤāĻžāϰ āĻāϝāĻŧāĻāĻž āĻāϝāĻŧāύāĻž-āĻļāĻŦā§āĻĻ, āĻāϰ āϏāĻŦāĻā§āϝāĻŧā§ āϞāĻŽā§āĻŦāĻž āĻāϝāĻŧāύāĻž-āĻļāĻŦā§āĻĻ āĻā§āύāĻāĻžāĨ¤
Input. āĻāĻ āϞāĻžāĻāύ⧠n, āϤāĻžāϰāĻĒāϰ n-āĻāĻž āĻļāĻŦā§āĻĻ, space āĻŦāĻž āύāϤā§āύ āϞāĻžāĻāύ āĻĻāĻŋāϝāĻŧā§ āĻāϞāĻžāĻĻāĻžāĨ¤
Output. āϞāĻžāĻāύ 1: āĻļāĻŦā§āĻĻāĻā§āϞā§āϰ āĻāϝāĻŧāĻāĻž āĻāϝāĻŧāύāĻž-āĻļāĻŦā§āĻĻāĨ¤ āϞāĻžāĻāύ 2: āϏāĻŦāĻā§āϝāĻŧā§ āϞāĻŽā§āĻŦāĻž āĻāϝāĻŧāύāĻž-āĻļāĻŦā§āĻĻ; āϏāĻŽāĻžāύ āϞāĻŽā§āĻŦāĻž āĻāϝāĻŧā§āĻāĻāĻž āĻĨāĻžāĻāϞ⧠āϤāĻžāϞāĻŋāĻāĻžāϝāĻŧ āϝā§āĻāĻž āĻāĻā§, āϏā§āĻāĻž; āĻāϰ āĻāĻāĻāĻžāĻ āύāĻž āĻĨāĻžāĻāϞ⧠noneāĨ¤
Constraints. 1 <= n <= 100000āĨ¤ āĻĒā§āϰāϤāĻŋāĻāĻž āĻļāĻŦā§āĻĻ 1 āĻĨā§āĻā§ 20āĻāĻž āĻā§āĻ āĻšāĻžāϤā§āϰ āĻāĻāϰā§āĻāĻŋ āĻ āĻā§āώāϰāĨ¤
Sample. Input 6 āĻāϰ level noon map racecar wow tea āĻĻāĻŋāϞ⧠4, āϤāĻžāϰāĻĒāϰ racecarāĨ¤ āĻāϝāĻŧāύāĻž-āĻļāĻŦā§āĻĻāĻā§āϞ⧠āĻšāϞ⧠level, noon, racecar āĻāϰ wowāĨ¤
#include <algorithm>
#include <iostream>
#include <string>
using namespace std;
int main() {
int n;
cin >> n;
int mirrors = 0; // how many words read the same backwards
string longest = ""; // the longest of them so far
for (int i = 0; i < n; i++) {
string word;
cin >> word;
// Make a reversed copy of word with reverse. If the two are equal,
// count the word, and keep it if it is longer than longest.
}
// Line 1: mirrors. Line 2: longest, or none if no word was a mirror.
return 0;
}
āĻāϞāĻžāĻĻāĻž āĻāϰ⧠grade āĻšāϝāĻŧ āύāĻžāĨ¤ āĻļāĻŦā§āĻĻāĻāĻžāϰ āĻāĻāĻāĻž copy āĻŦāĻžāύāĻžāĻ, copy-āĻāĻžāĻā§ reverse āĻāϰā§, āĻāϰ āĻĻā§āĻāĻāĻž string == āĻĻāĻŋāϝāĻŧā§ āĻŽā§āϞāĻžāĻāĨ¤ āĻā§āύ⧠āĻļāĻŦā§āĻĻ āϰāĻžāĻā§ āĻļā§āϧ⧠āϤāĻāύāĻ, āϝāĻāύ āϏā§āĻāĻž āĻšāĻžāϤā§āϰ āĻļāĻŦā§āĻĻā§āϰ āĻā§āϝāĻŧā§ āϏāϤā§āϝāĻŋāĻ āϞāĻŽā§āĻŦāĻž; āϤāĻžāĻšāϞ⧠āϏāĻŽāĻžāύ āϞāĻŽā§āĻŦāĻžāĻĻā§āϰ āĻŽāϧā§āϝ⧠āĻĒā§āϰāĻĨāĻŽāĻāĻžāĻ āĻĨā§āĻā§ āϝāĻžāϝāĻŧāĨ¤
Kenji-āϰ āĻāĻžāĻā§ āĻāϝāĻŧā§āĻāĻāĻž āϏāĻāĻā§āϝāĻžāϰ āĻāĻžāϰā§āĻĄ āĻāĻā§āĨ¤ āϏāĻŦāĻā§āϞ⧠āĻāĻ āϏāĻžāϰāĻŋāϤ⧠āĻŦāϏāĻŋāϝāĻŧā§ āϏ⧠āĻāĻāĻāĻž āϞāĻŽā§āĻŦāĻž āϏāĻāĻā§āϝāĻž āĻŦāĻžāύāĻžāϝāĻŧ, āĻāϰ āĻāĻžāϝāĻŧ āϝāϤ āĻŦāĻĄāĻŧ āϏāĻŽā§āĻāĻŦ āϏāĻāĻā§āϝāĻžāĨ¤ āϏāĻŦāĻā§āϝāĻŧā§ āĻŦāĻĄāĻŧ āĻāĻžāϰā§āĻĄāĻāĻž āĻāĻā§ āĻŦāϏāĻžāϞā§āĻ āĻšāϝāĻŧ āύāĻž: 3 āĻāϰ 30 āĻāĻ āĻāĻžāĻŦā§ āĻŦāϏāĻžāϞ⧠330, āĻāϰā§āĻ āĻāĻžāĻŦā§ 303āĨ¤
Input. āĻāĻ āϞāĻžāĻāύ⧠n, āϤāĻžāϰāĻĒāϰ āĻāĻžāϰā§āĻĄāĻā§āϞā§āϰ n-āĻāĻž āϏāĻāĻā§āϝāĻžāĨ¤
Output. āĻāĻ āϞāĻžāĻāύ: āĻāĻžāϰā§āĻĄāĻā§āϞ⧠āϏāĻžāϰāĻŋāϤ⧠āĻŦāϏāĻŋāϝāĻŧā§ āĻŦāĻžāύāĻžāύ⧠āϝāĻžāϝāĻŧ āĻāĻŽāύ āϏāĻŦāĻā§āϝāĻŧā§ āĻŦāĻĄāĻŧ āϏāĻāĻā§āϝāĻžāĨ¤
Constraints. 1 <= n <= 8āĨ¤ āĻĒā§āϰāϤāĻŋāĻāĻž āĻāĻžāϰā§āĻĄā§ 1 āĻĨā§āĻā§ 999-āĻāϰ āĻāĻāĻāĻž āĻĒā§āϰā§āĻŖāϏāĻāĻā§āϝāĻžāĨ¤
Sample. Input 5 āĻāϰ 3 30 34 5 9 āĻĻāĻŋāϞ⧠9534330, āĻā§āϰāĻŽāĻāĻž 9, 5, 34, 3, 30āĨ¤
#include <algorithm>
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int main() {
int n;
cin >> n;
vector<string> cards(n); // each card's number, kept as text
for (string& c : cards) {
cin >> c;
}
string best = ""; // the biggest number found so far
// Try every order of the cards. For each order, join the cards into one
// string; keep it if it is a bigger number than best. Every joined string
// has the same length, so comparing two of them as strings works.
// Print best.
return 0;
}
āĻāϞāĻžāĻĻāĻž āĻāϰ⧠grade āĻšāϝāĻŧ āύāĻžāĨ¤ Lesson āϝ⧠āĻāĻĨāĻžāĻāĻž āĻļā§āϧ⧠āĻāĻā§āĻāĻŋāϤ⧠āĻŦāϞā§āĻā§: next_permutation string-āĻāϰ vector-āĻāϰ āĻāĻĒāϰāĻ āĻāϞā§, āĻāĻĻā§āϰ dictionary order āϧāϰā§āĨ¤ āĻāĻāĻāĻž āĻāĻžāϰā§āĻĄā§ āĻŦāĻĄāĻŧāĻā§āϰ 40320āĻāĻž āĻā§āϰāĻŽ, āϏāĻŦāĻā§āϞ⧠āĻā§āώā§āĻāĻž āĻāϰ⧠āĻĻā§āĻāĻžāϰ āĻŽāϤ⧠āĻāĻŽāĨ¤
āϏāĻāϰāĻžāĻāϰ āϝ⧠āĻĒā§āϰāĻļā§āύāĻā§āϞ⧠āĻāϏā§
āϏāĻžāϧāĻžāϰāĻŖ while āύāĻž, do-while āĻā§āύ?
āϏāĻžāϧāĻžāϰāĻŖ
while (next_permutation(...))body āĻāĻāĻŦāĻžāϰ āĻāϞāĻžāϰ āĻāĻā§āĻ function-āĻāĻž call āĻāϰ⧠āĻĢā§āϞā§āĨ¤ āϤāĻžāĻšāϞ⧠āĻļā§āϰā§āϰ āĻā§āϰāĻŽāĻāĻž āĻāĻžāĻā§ āϞāĻžāĻāĻžāύā§āϰ āĻāĻā§āĻ āϏāϰ⧠āϝā§āϤ, āĻāϰ āϏāĻŦāĻā§āϝāĻŧā§ āĻā§āĻ āĻā§āϰāĻŽāĻāĻž āĻšāĻžāϰāĻŋāϝāĻŧā§ āϝā§āϤāĨ¤ Do-while āĻāĻā§ āĻā§āϰāĻŽāĻāĻž āĻāĻžāĻā§ āϞāĻžāĻāĻžāϝāĻŧ, āϤāĻžāϰāĻĒāϰ āϏāϰāĻžāϝāĻŧāĨ¤āĻāĻ call-āĻā§āϞ⧠āĻāĻŋ array āĻāϰ string-āĻāĻ āĻāϞā§?
āĻšā§āϝāĻžāĻāĨ¤ Algorithm-āĻāϰ āĻĻāϰāĻāĻžāϰ āĻļā§āϧ⧠āĻĻā§āĻāĻāĻž iterator, āĻāϰ pointer-āĻ iterator-āĻāϰ āĻāĻžāĻ āĻāϰā§, āϤāĻžāĻ
accumulate(a, a + n, 0)n-āĻāĻž int-āĻāϰ āĻāĻāĻāĻž āϏāĻžāϧāĻžāϰāĻŖ array āϝā§āĻ āĻāϰā§āĨ¤ āĻāĻāĻāĻžstring-āĻāϰbegin()āĻāϰend()-āĻ āĻāϞā§, Kenji-āϰ āϤāĻžāϞāĻžāϝāĻŧ āϝā§āĻŽāύ āĻĻā§āĻāϞā§āĨ¤accumulateāĻāĻŋ āĻāĻŽāĻžāϰ āύāĻŋāĻā§āϰ loop-āĻāϰ āĻā§āϝāĻŧā§ āĻĻā§āϰā§āϤ?āύāĻž, āĻāĻŦāĻžāϰ āϧā§āϰāĻ āύāĻžāĨ¤ āĻĻā§āĻā§āĻ āĻĒā§āϰāϤāĻŋāĻāĻž element āĻāĻāĻŦāĻžāϰ āĻĻā§āĻā§,
O(n), āĻāϰ lesson 04 āĻĻā§āĻā§āĻā§ āĻĒāĻžāĻļāĻžāĻĒāĻžāĻļāĻŋ āĻŽāĻžāĻĒāĻŦā§āĨ¤ Call āĻā§āϤ⧠āĻĒāϰāĻŋāώā§āĻāĻžāϰ āϞā§āĻāĻžāϝāĻŧ, āĻāϰ āϝ⧠bug āĻāϰ āĻšāϤā§āĻ āĻĒāĻžāϰ⧠āύāĻž āϤāĻžāϤā§, āĻāϤāĻŋāϤ⧠āύāĻžāĨ¤āĻāĻžāϞāĻŋ vector-āĻ
max_elementāĻā§ āĻĢā§āϰāϤ āĻĻā§āϝāĻŧ?end(), āĻāĻžāϰāĻŖ āĻĻā§āĻāĻžāύā§āϰ āĻŽāϤ⧠āĻā§āύ⧠element āύā§āĻāĨ¤*end()āĻĒāĻĄāĻŧāĻž āĻšāϞ⧠undefined behaviour, āϤāĻžāĻ āĻāϤā§āϤāϰ āĻĒāĻĄāĻŧāĻžāϰ āĻāĻā§v.empty()check āĻāϰ⧠āύāĻžāĻāĨ¤
āĻŽā§āϞ āĻāĻĨāĻž
- āĻāĻāĻāĻž algorithm āĻāĻāĻāĻž range
[first, last)āύā§āϝāĻŧ:firstāύā§āĻāϝāĻŧāĻž āĻšāϝāĻŧ,lastāύāĻžāĨ¤ āĻšāĻŋāϏāĻžāĻŦā§āϰ algorithm-āĻā§āϞ⧠āĻĨāĻžāĻā§<numeric>-āĻ, āĻŦāĻžāĻāĻŋāϰāĻž<algorithm>-āĻāĨ¤ accumulate,count,max_elementāĻāϰreverseāĻĒā§āϰāϤāĻŋāĻāĻž āĻāĻāĻāĻž āĻāϰ⧠āĻšāĻžāϤ⧠āϞā§āĻāĻž loop-āĻāϰ āĻāĻžāϝāĻŧāĻāĻž āύā§āϝāĻŧ, āĻāĻāĻO(n)-āĻ, āĻāϰ āĻā§āϞ āĻāϰāĻžāϰ āĻŽāϤ⧠āĻā§āύ⧠index āĻāĻžāĻĄāĻŧāĻžāĻāĨ¤- āĻāĻā§
sort, āϤāĻžāϰāĻĒāϰdo { } while (next_permutation(...)): āĻĒā§āϰāϤāĻŋāĻāĻž āĻā§āϰāĻŽ āĻāĻāĻŦāĻžāϰ āĻāϰ⧠āĻāϏā§, āĻā§āĻ āĻĨā§āĻā§ āĻŦāĻĄāĻŧāϤā§; āĻā§āύ⧠āĻŽāĻžāύ āĻĻā§āĻāĻŦāĻžāϰ āĻĨāĻžāĻāϞ⧠āĻĒā§āϰāϤāĻŋāĻāĻž āĻāϞāĻžāĻĻāĻž āĻā§āϰāĻŽ āĻāϏ⧠āĻāĻāĻŦāĻžāϰāĨ¤ accumulateāϝā§āĻāĻĢāϞ āϰāĻžāĻā§ āĻļā§āϰā§āϰ āĻŽāĻžāύā§āϰ type-āĻ: āĻŦāĻĄāĻŧ āϝā§āĻāĻĢāϞā§0LL, āĻāĻā§āύāĻžāĻāĻļā§0.0āĨ¤- n-āĻāĻž āĻāĻŋāύāĻŋāϏā§āϰ āĻā§āϰāĻŽ n!-āĻāĻž: 10āĻāĻž āĻāĻŋāύāĻŋāϏā§āϰ 3628800āĻāĻž āĻā§āϰāĻŽ āĻāĻāĻžāϰā§āĻŦāĻžāϰ⧠āϞā§āĻā§āĻā§ 7.4 āĻĨā§āĻā§ 16.8 ms, āĻāϰ āĻĒā§āϰāϤāĻŋāĻāĻž āĻŦāĻžāĻĄāĻŧāϤāĻŋ āĻāĻŋāύāĻŋāϏ āϏāĻŽāϝāĻŧāĻāĻžāĻā§ āĻā§āĻŖ āĻāϰ⧠āĻŦāĻžāĻĄāĻŧāĻžāϝāĻŧāĨ¤
- āĻāϰāĻ āĻāĻā§āϰ⧠āϝā§āϤ⧠āĻāĻžāĻāϞā§: Under the Hood, introselect, next_permutation-āĻāϰ āĻāĻžāϰāĻāĻž āĻāĻžāϞ āĻāϰ āϝ⧠āϝā§āĻāĻĢāϞ āĻā§āϰ⧠āϝāĻžāϝāĻŧ (Pro)āĨ¤
āĻāϰāĻĒāϰ lesson 02 āĻāĻ āϏāĻžāĻĒā§āϤāĻžāĻšāĻŋāĻ set-āĻāϰ āĻĒā§āϰāϤāĻŋāĻāĻž algorithm āĻāĻāĻāĻž āĻāĻāĻāĻž āĻāϰ⧠āĻĻā§āĻāĻžāĻŦā§, āĻĒā§āϰāϤāĻŋāĻāĻžāϰ āĻāϰāĻāϏāĻšāĨ¤
lesson ā§§ āĻļā§āώ
āĻļā§āώ āĻšāϞ⧠āĻāĻŋāĻšā§āύ āĻĻāĻŋāύ, āĻ āĻā§āϰāĻāϤāĻŋ āĻāĻĒāύāĻžāϰ āϏāĻžāĻĨā§ āĻĨāĻžāĻāĻŦā§āĨ¤
āĻĒāϰā§āϰāĻāĻž: āϏāĻžāĻĒā§āϤāĻžāĻšāĻŋāĻ algorithm-āĻā§āϞā§āϰ āĻĒā§āϰāϤāĻŋāĻāĻž, āĻāĻāĻāĻž āĻāĻāĻāĻž āĻāϰā§, āĻāϰāĻāϏāĻš