学习视频:10-常用 STL练习(C++ 版)_哔哩哔哩_bilibili
Q:推积木
学!!!
vec[b].clear(); //不清空间
vector<int>().swap(vec[b]); //清一下b以及它的空间
vector<int> vec[10005];
int main()
{
int n, m;
cin >> n >> m;
for (int i = 1; i <= n; i++) { //初始化
vec[i].push_back(i);
}
int a, b;
int temp;
for (int i = 0; i < m; i++) {
cin >> a >> b;
if (a == b) continue;
else {
if (!vec[b].empty()) {
for (int j = 0; j < vec[b].size(); j++) {
vec[a].push_back(vec[b][j]);
}
}
vec[b].clear(); //不清空间
vector<int>().swap(vec[b]); //清一下b以及它的空间
}
}
int len;
for (int i = 1; i <= n; i++) {
len = vec[i].size();
for (int j = 0; j < len; j++) {
cout << vec[i][j] << " ";
}
cout << endl;
}
return 0;
}
Q;计算集合的并
学!!!
for (set<int>::iterator it = a.begin(); it != a.end();it++) {
cout << *it <<" "; //!!!1
}
set<int> a;
int main()
{
int n, m;
cin >> n >> m;
int aa;
for (int i = 0; i < n + m; i++) {
cin >> aa;
a.insert(aa);
}
int len = a.size();
for (set<int>::iterator it = a.begin(); it != a.end();it++) {
cout << *it <<" "; //!!!1
}
return 0;
}
Q:学英语
学!!!
sum = word.size();
sum = word.length();
//都可以!!!
set<string> s0;
set<string> s1;
int main()
{
int n;
cin >> n;
int flag, sum = 0;
string word;
for (int i = 0; i < n; i++) {
cin >> flag >> word;
sum = word.size();
for (int i = 0; i < sum; i++) {
if (word[i] <= 'z' && word[i] >= 'a')
continue;
else
word[i] += 'a' - 'A';
}
if (flag == 0)
s0.insert(word);
else {
if (s0.count(word))
cout << "Yes" << endl;
else
cout << "No" << endl;
}
}
return 0;
}
Q:面试
map<int, int> shu;
int main()
{
int n;
cin >> n;
int num;
for (int i = 0; i < n; i++) {
cin >> num;
shu[num]++; //!!!之前没有出现,会自动初始化为0
}
int ans = 0;
for (map<int, int>::iterator it = shu.begin(); it != shu.end(); it++) {
if (it->second >= ans) {
ans = it->second;
num = it->first;
}
}
cout << num << " " << ans << endl;
return 0;
}
Q:水果店
#include<iostream>
#include<map>
#include<string>
#include<utility> //!!!
using namespace std;
map<string, map<string, int>> m;
int main()
{
int num;
string di, guo;
int n;
cin >> n;
//map<string, int> mm;
for (int i = 0; i < n; i++) {
cin >> guo >> di >> num;
m[di][guo] += num; //!!!
//mm[guo] += num;
//m[di] = mm;
}
for (map<string, map<string, int>>::iterator it = m.begin(); it != m.end(); it++) {
cout << it->first << '\n';
for (map<string, int>::iterator it1 = it->second.begin(); it1 != it->second.end(); it1++) {
cout << " |----" << it1->first << "(" << it1->second << ")" << '\n';
}
}
return 0;
}
——————————————————————————————
学习视频:11-栈和递归视频讲解_哔哩哔哩_bilibili
S:手动实现一个栈
、
#include<iostream>
using namespace std;
struct Stack {
int data[10000];
int top = -1;
void push(int x) {
top++;
if(top<10000)
data[top] = x;
else {
top--;
cout << "stack overflow";
}
}
void pop() {
if (top >= 0)
top--;
}
int topval() {
if (top >= 0)
return data[top];
}
};
int main()
{
Stack s;
for (int i = 1; i <= 10; i++) {
s.push(i);
}
for (int i = 1; i <= 10; i++) {
cout << s.topval() << " ";
s.pop();
}
return 0;
}
学!!!!
push() 入栈
pop() 弹出栈顶元素(void)
top() 返回栈顶元素
empty() 是否为空
size() 栈的元素个数Q:火车出入站
Q:
using namespace std;
int main() {
int n;
cin >> n;
vector<int> a(n); //!!!初始化n个空间
for (int i = 0; i < n; i++) {
cin >> a[i];
}
stack<int> s;
int cur = 1; //未压入栈的起始位置
bool f = 1;
for (int i = 0; i < n; i++) {
while ((s.empty() || s.top() != a[i]) && (cur<=n)) {
s.push(cur);
cur++;
}
if (s.empty() || s.top() != a[i]) {
f = 0; break;
}
else {
s.pop();
}
}
if (f) {
cout << "legel" << endl;
}
else
cout << "illegal" << endl;
return 0;
}
S:递归
Q:阶乘:
long long factorial(int n) {
if (n == 1 || n == 0) return 1;
else
return factorial(n - 1) * n;
}
int main() {
int n;
cin >> n;
cout << factorial(n);
return 0;
}
Q:汉诺塔问题
#include<iostream>
#include<stack>
using namespace std;
stack<int> S[3];
void move(int x,int y) {
int temp = S[x].top();
S[x].pop();
S[y].push(temp);
cout << x << "-->" << y << '\n';
}
void hanoi(int A, int B, int C, int n) { //A经过B到C,移动n个盘子
if (n == 1) { //直接移动
move(A, C);
return;
}
hanoi(A, C, B, n - 1);
move(A, C);
hanoi(B, A, C, n - 1);
}
int main() {
int n;
cin >> n;
for (int i = n; i >= 1; i--) {
S[0].push(i);
}
hanoi(0, 1, 2, n);
while (!S[2].empty()) {
cout << S[2].top() << " ";
S[2].pop();
}
return 0;
}
Q:汉诺塔2
#include<iostream>
#include<stack>
using namespace std;
long long f[65], g[65];
int main() {
int n;
cin >> n;
f[1] = 1;
//!!!递归实质上就是我们的一个循环,每一个结果保存在数组里对应的层数上
for (int i = 2; i <= n; i++) {
f[i] = 2 * f[i - 1] + 1;
}
g[1] = 1;
for (int i = 2; i <= n; i++) {
g[i] = 2 * g[i-1] + i;
}
cout << f[n] << " " << g[n] << endl;
return 0;
}
————————————————————————————————————
学不了了,明天再学吧