Hello 2019题解

题解 CF1097A 【Gennady and a Card Game】

map大法好qwq

枚举每一个的第\(1,2\)位判是否与给定的重复即可

  1. # include <bits/stdc++.h>
  2. std::map<char, int> m1, m2;
  3. int main()
  4. {
  5. std::string s[6], str;
  6. std::cin >> str;
  7. for(int i = 1; i <= 5; i++)
  8. std::cin >> s[i], m1[s[i][0]] = 1, m2[s[i][1]] = 1;
  9. if(m1[str[0]] || m2[str[1]])
  10. return printf("YES\n") * 0;
  11. printf("NO\n");
  12. return 0;
  13. }

题解 CF1097B 【Petr and a Combination Lock】

\(dfs\)入门题,下一个

枚举每一个是正还是负,最后判能不能被\(360\)整除即可

时间复杂度\(O(2^n)\)


  1. # include <bits/stdc++.h>
  2. int n, flag, a[20], used[20];
  3. inline void check()
  4. {
  5. int sum = 0;
  6. for(int i = 1; i <= n; i++)
  7. sum += a[i] * (used[i] ? (-1) : 1);
  8. if(sum % 360 == 0)
  9. flag = 1;
  10. }
  11. void dfs(int x)
  12. {
  13. if(x == n + 1)
  14. return (void) (check());
  15. dfs(x + 1);
  16. used[x] = 1;
  17. dfs(x + 1);
  18. used[x] = 0;
  19. }
  20. int main()
  21. {
  22. scanf("%d", &n);
  23. for(int i = 1; i <= n; i++)
  24. scanf("%d", &a[i]);
  25. dfs(1);
  26. printf(flag ? "YES" : "NO");
  27. return 0;
  28. }

题解 CF1097C 【Yuhao and a Parenthesis】

说起Yuhao,我就不得不提@BlueCat,想起了他旋转**的情景,明年,中美,两开花,关注

对于每个括号序列,我们都用栈预处理出它不能配对的部分

等等?什么叫不能配对的部分?

比如说序列\()())\),\())\)就是它不能配对的部分

然后把这个部分取反

就得到了如果要把这个序列弄成正确的需要的最简序列\(x_i\)

显然这个部分要放在当前串的前面或后面

但是我们有些时候发现这东西是假的

比如这个序列\())))((((\),它的匹配序列是\((((())))\),很明显放前或后都不行,那么这个串就废了

如果这个串没废,就把\(x_i\)的计数累加\(1\)

然后我们枚举每一个\(x_i\),将\(ans\)累加上\(\min{x_i,x_i取反}\)(取反只把一个括号序列中'('变成')',反之亦然)

注意这里有一个特判,如果有一个串本来就是好的,那么统计答案时,由于空串的反串还是空串,所以答案会算两次

所以要特判出好串的个数\(cnt\)

最后输出\(ans/2+cnt/2\)即可(下取整)

  1. #include <bits/stdc++.h>
  2. const int MaxN = 100010, MaxM = 500010;
  3. std::string s[MaxN], str[MaxN];
  4. std::map<std::string, int> m;
  5. inline std::string change(std::string s)
  6. {
  7. int len = s.length();
  8. std::string tmp = "";
  9. for (int i = 0; i < len; i++)
  10. tmp += ((s[i] == '(') ? ')' : '(');
  11. return tmp;
  12. }
  13. inline int check1(std::string s)
  14. {
  15. std::stack<char> st;
  16. int len = s.length();
  17. for (int i = 0; i < len; i++)
  18. {
  19. if (s[i] == '(')
  20. st.push('(');
  21. else if (s[i] == ')' && st.empty())
  22. return 0;
  23. else
  24. st.pop();
  25. }
  26. return 1;
  27. }
  28. inline void check(int x, std::string s)
  29. {
  30. std::vector<char> st;
  31. int len = s.length();
  32. for (int i = 0; i < len; i++)
  33. {
  34. if (st.empty())
  35. {
  36. st.push_back(s[i]);
  37. continue;
  38. }
  39. if (s[i] == '(')
  40. st.push_back('(');
  41. else if (s[i] == ')' && st.back() == '(')
  42. st.pop_back();
  43. else if (s[i] == ')' && st.back() == ')')
  44. st.push_back(')');
  45. }
  46. std::string tmp = "";
  47. for (int i = 0; i < st.size(); i++)
  48. tmp += ((st[i] == '(') ? ')' : '(');
  49. if (check1(tmp + s) || check1(s + tmp))
  50. ++m[tmp];
  51. // std::cout << " " << s << " " << tmp << "\n";
  52. }
  53. int main()
  54. {
  55. int n, ans = 0;
  56. scanf("%d", &n);
  57. for (int i = 1; i <= n; i++)
  58. std::cin >> s[i], check(i, s[i]);
  59. for (std::map<std::string, int>::iterator it = m.begin(); it != m.end(); ++it)
  60. {
  61. if (it->first == "")
  62. continue;
  63. ans += std::min(it->second, m[change(it->first)]);
  64. }
  65. printf("%d\n", (ans / 2) + (m[""] / 2));
  66. return 0;
  67. }

Hello 2019题解的更多相关文章

  1. ICPC World Finals 2019 题解

    [A]Azulejos 题意简述: 有两排瓷砖,每排都有 \(n\) 个,每个瓷砖有高度 \(h_i\) 和价格 \(p_i\) 两种属性. 你需要分别重新排列这两排瓷砖,使得同一排的瓷砖满足价格不降 ...

  2. Code Chef February Challenge 2019题解

    传送门 \(HMAPPY2\) 咕 话说这题居然卡\(scanf\)的么??? int T;cin>>T; while(T--){ cin>>n>>a>> ...

  3. CodeChef March Challenge 2019题解

    传送门 \(CHNUM\) 显然正数一组,负数一组 for(int T=read();T;--T){ n=read(),c=d=0; fp(i,1,n)x=read(),x>0?++c:++d; ...

  4. Code Chef April Cook-Off 2019题解

    传送门 \(PEWDSVTS\) 我哪根筋不对了要把所有可行的拿出来\(sort\)一下--还有忘开\(long\ long\)真的好难受-- int main(){ // freopen(" ...

  5. Atcoder Tenka1 Programmer Contest 2019 题解

    link 题面真简洁 qaq C Stones 最终一定是连续一段 . 加上连续一段 # .直接枚举断点记录前缀和统计即可. #include<bits/stdc++.h> #define ...

  6. Atcoder Tenka1 Programmer Contest 2019题解

    传送门 \(C\ Stones\) 最后肯定形如左边一段白+右边一段黑,枚举一下中间的断点,预处理一下前缀和就可以了 int main(){ // freopen("testdata.in& ...

  7. Code Chef January Challenge 2019题解

    传送门 \(div2\)那几道题不来做了太水了-- \(DPAIRS\) 一个显然合法的方案:\(A\)最小的和\(B\)所有连,\(A\)剩下的和\(B\)最大的连 算了咕上瘾了,咕咕咕 const ...

  8. CodeChef April Challenge 2019题解

    传送门 \(Maximum\ Remaining\) 对于两个数\(a,b\),如果\(a=b\)没贡献,所以不妨假设\(a<b\),有\(a\%b=a\),而\(b\%a<a\).综上, ...

  9. AtcoderExaWizards 2019题解

    传送门 \(A\ Regular\ Triangle\) 咕咕 \(B\ Red\ or\ Blue\) 咕咕咕 \(C\ Snuke\ the\ Wizard\) 我可能脑子真的坏掉了-- 容易发现 ...

随机推荐

  1. Shiro身份认证、盐加密

    目的: Shiro认证 盐加密工具类 Shiro认证 1.导入pom依赖 <dependency> <groupId>org.apache.shiro</groupId& ...

  2. Docker 学习笔记(一):基础命令

    仅为个人查阅使用,要学习 Docker 的话,推荐看这份文档:<Docker - 从入门到实践> P.S. 大多数的 docker container xxx/docker image x ...

  3. Luogu5290 [十二省联考2019] 春节十二响 【贪心】【堆】

    题目分析: 对于一个根,假设我们对每个子树分别求出了一种答案,那么怎么合并答案是最小的呢? 首先考虑这些答案里面最大的那个数字,它肯定要融合其它组里面的最大数字.以此类推 所以最好的合并方式是,每个子 ...

  4. Java帖子

    IDEA新手使用教程(详解):https://cloud.tencent.com/developer/article/1448115 Java学习文档:https://www.sxt.cn/Java_ ...

  5. ajax中的事件

    blur : 当光标移开时(点击)触发 change : 当光标移开并且文本框中的内容和上一次不一致时(点击)触发

  6. aliyun maven仓库连不上

    长时间未使用maven仓库,今天使用发现始终无法下载jar包,连不上阿里云maven仓库. 因为之前一直使用正常,以为是idea maven设置的有问题,再三确认地址无误,maven offline也 ...

  7. tree 树形加载及增删改

    //异步1<template> <div class="addequipment org"> <div class="top"&g ...

  8. Android笔记(十五) Android中的基本组件——单选框和复选框

    单选框和多选框通常用来在设置用户个人资料时候,选择性别.爱好等,不需要用户直接输入,直接在备选选项中选择,简单方便. 直接看代码: <?xml version="1.0" e ...

  9. zookeeper服务【-】windows安装与liunx安装

    windows安装zookeeper-3.4.14 https://www.apache.org/dyn/closer.cgi/zookeeper/ [zookeeper下载地址] 1.开启服务之前需 ...

  10. FastDateFormat日期工具类

    原文:https://blog.csdn.net/u013823538/article/details/80197476 public class DateUtil { public static f ...