8分钟a了前两个,然后第三个,头卡掉了。(记录一下悲惨的经历。
就继续磨题解吧。
琢磨题解的时候发现了这个:
#ifdef LOCAL
#include "algo/debug.h"
#else
#define debug(...) 42
#endif
学习一下,形式:
#ifdef 标识符
程序段1
#else
程序段2
#endif
意思是:当标识符已经被定义过(一般使用#define命令定义)则对程序段1进行编译,否则编译程序段2。
浅显理解一下
继续优化一下c++代码:
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
关于这个东西。
sync_with_stdio:是否兼容stdio的开关,c++中既可以使用printf也可以使用cout,也可以混用这两个输出方式。
关闭iostream的输入输出缓存,让cin和cout的效率与scanf和printf相差不大。
来看第一题:
输入一个字符串,交换第a和第b两个位置的字符,然后输出。
代码如下:
#include <bits/stdc++.h>
using namespace std;
#ifdef LOCAL
#include "algo/debug.h"
#else
#define debug(...) 42
#endif
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
string s;
cin >> s;
int a, b;
cin >> a >> b;
swap(s[a - 1], s[b - 1]);
cout << s << '\n';
return 0;
}
一点点代码风格,头文件,using namespace std;,和题解代码换行分开。
值得学习,使用纯c++,加上ios::sync_with_stdio(false);cin.tie(0);以提高输入输出效率。
交换字符,使用函数swap(a,b).
第二题,题意:输入n,从1到n都有四个数字,其中有一个数字有三个,输出这个数字。
我第一个思路是计数,cnt=3的那个数字输出,当然这样需要遍历两遍。
不妨考虑一下数学方法,一个数的偶数次异或结果是0,这不,最后不就只剩下那个3个的数了吗?既节省时间,又节省空间。太棒了!
代码:
/**
* author: tourist
* created: 23.01.2022 15:00:42
**/
#include <bits/stdc++.h>
using namespace std;
#ifdef LOCAL
#include "algo/debug.h"
#else
#define debug(...) 42
#endif
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
int n;
cin >> n;
int x = 0;
for (int i = 0; i < 4 * n - 1; i++) {
int y;
cin >> y;
x ^= y;
}
cout << x << '\n';
return 0;
}
值得学习的地方就是 x^=y 这个数学式子,巧妙的等效了一个开数组,一层遍历。
第三题就是卡掉脑袋的题。最高效的是用vector map做,还是使用的不熟练,继续巩固。
第三题是先输入n个字符串,再输入m个字符串,如果m中有n中的字符串,输出Yes,否则输出No。
代码:
/**
* author: tourist
* created: 23.01.2022 15:01:51
**/
#include <bits/stdc++.h>
using namespace std;
#ifdef LOCAL
#include "algo/debug.h"
#else
#define debug(...) 42
#endif
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
int n, m;
cin >> n >> m;
vector<bool> res(n, false);
map<string, int> mp;
for (int i = 0; i < n; i++) {
string s;
cin >> s;
mp[s] = i;
}
for (int j = 0; j < m; j++) {
string s;
cin >> s;
res[mp[s]] = true;
}
for (int i = 0; i < n; i++) {
cout << (res[i] ? "Yes" : "No") << '\n';
}
return 0;
}
首先,忘了定义vector最常用的方法了???
//定义具有10个整型元素的向量,且给出的每个元素初值为1
vector<bool> res(n,0);
//意思是定义vector bool类型 res 大小为n 其中元素初始值为0
还不止这个,c++stl中很重要的map!
开始学习map容器(暴露自己又菜又懒了):
map是stl里的一个关联容器,,提供一对一的hash映射。(key与value)
map的底层结构是红黑树,红黑树对数据自动排序,故map中的元素自动有序。
map头文件#include< map> 当然万能头也行。
然后定义:std::map<string,int> personnel;
其中第一个类型是关键字的类型,第二个是存储对象的类型,本题就定义了string类型的关键字作为索引,并拥有相关联的指向int的指针。
这个代码还有一个很巧妙的地方,
string s;
cin >> s;
mp[s] = i;
使用string做索引,使用i做数据存储。想法很赞。
接下来的思路是,输入m的字符串,里面存在的使用res标记,最后输出。
其中还有值得学习的东西,最后的三目运算符
输出cout << (res[i] ? “Yes” : “No”);
要使用三目运算符把一个if-else的判断语句变成一句话,代码更简洁。