ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Atcoder Beginner Contest 236 ABC 代码风格 格式#ifdef#else#endif ios::sync_with_stdio tie 异或 map容器 vector容器

2022-01-25 22:58:00  阅读:177  来源: 互联网

标签:容器 ABC map int stdio cin Atcoder debug include


在这里插入图片描述
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的判断语句变成一句话,代码更简洁。

标签:容器,ABC,map,int,stdio,cin,Atcoder,debug,include
来源: https://blog.csdn.net/weixin_51273276/article/details/122663141

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有