AtCoder Beginner Contest 223

  • A是纯纯的水题,就不说了

B - String Shifting

思路分析

  • 我真的sb,一开始想了好久是不是和全排列有关,然后读了好几遍题目也没有想法。
  • 最后看了眼数据范围S串的长度为1000,\(O(N^2)\)是可以过的。
  • 然后我是这样想的,对于每一个位置都有可能成为答案的第一位,对于原串在它后面的字符在新串中不改变,在它前面的字符接在最后即可,然后对于每一个位置放在第一位构成字符串存起来,最后sort得到答案。
  • 看了眼别人的做法,比我的巧妙多了,直接用两个相同的字符串接上,对于每一个位求长度为\(s.size()\)的字串,更新答案即可。

代码如下

  1. //当场做的
  2. #include <bits/stdc++.h>
  3. using namespace std;
  4. const int maxn = 2e5 + 10;
  5. string ans[maxn];
  6. int cnt;
  7. int main()
  8. {
  9. ios::sync_with_stdio(0);
  10. cin.tie(0);
  11. cout.tie(0);
  12. string s;
  13. cin >> s;
  14. string tmp;
  15. for (int i = 0; i < s.size(); i++)
  16. {
  17. tmp.clear();
  18. for (int j = i; j < s.size(); j++)
  19. {
  20. tmp += s[j];
  21. }
  22. for (int j = 0; j < i; j++)
  23. {
  24. tmp += s[j];
  25. }
  26. ans[++cnt] = tmp;
  27. }
  28. sort(ans + 1, ans + 1 + cnt);
  29. cout << ans[1] << endl;
  30. cout << ans[cnt] << endl;
  31. return 0;
  32. }
  1. //巧妙方法
  2. #include <bits/stdc++.h>
  3. using namespace std;
  4. int main()
  5. {
  6. ios::sync_with_stdio(0);
  7. cin.tie(0);
  8. cout.tie(0);
  9. string s;
  10. cin >> s;
  11. int len = s.size();
  12. string maxs = s;
  13. string mins = s;
  14. s = s + s;
  15. for (int i = 0; i < len; i++)
  16. {
  17. string tmp = s.substr(i, len);
  18. if (tmp > maxs)
  19. maxs = tmp;
  20. if (tmp < mins)
  21. mins = tmp;
  22. }
  23. cout << mins << endl;
  24. cout << maxs << endl;
  25. return 0;
  26. }

C - Doukasen

思路分析:

  • 此题惯例模拟题
  • 模拟即可,我们知道如只有一端有火焰的话燃烧完需要多少时间,然后令时间减少一半求左端火焰燃烧多少长度即可。
  • 注意double相等的判断。

代码如下:

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. const int maxn = 1e5 + 10;
  4. double l[maxn];
  5. double t[maxn];
  6. double suml[maxn];
  7. double sumt;
  8. const double eps = 1e-6;
  9. int main()
  10. {
  11. ios::sync_with_stdio(0);
  12. cin.tie(0);
  13. cout.tie(0);
  14. int n;
  15. cin >> n;
  16. for (int i = 1; i <= n; i++)
  17. {
  18. double x;
  19. cin >> l[i];
  20. suml[i] = suml[i - 1] + l[i];
  21. cin >> x;
  22. t[i] = l[i] / x;
  23. sumt += t[i];
  24. }
  25. sumt /= 2;
  26. int i;
  27. double tmp = 0.0;
  28. for (i = 1; i <= n; i++)
  29. {
  30. tmp += t[i];
  31. if (tmp >= sumt)
  32. {
  33. break;
  34. }
  35. }
  36. if (tmp - sumt > eps)
  37. {
  38. tmp -= t[i];
  39. i--;
  40. double ans = suml[i];
  41. ans += (sumt - tmp) * l[i + 1] / t[i + 1];
  42. cout << setprecision(15) << fixed << ans << endl;
  43. }
  44. else
  45. cout << setprecision(15) << fixed << suml[i] << endl;
  46. return 0;
  47. }

D - Restricted Permutation

思路分析:

  • 题刷少了,经典的拓扑排序加优先队列做不出来。
  • 我们可以考虑第一个样例,所有边构成图后,有\(2,3\)入度为0,那么我们把它们取出来放入到优先队列里,然后来取,我们可以认为在当前状态实际上\(2,3\)的等级相同,题目要求最小的拓扑序列,那么我们就用优先级队列来替代普通队列来保证答案是最小字典序。

代码如下:

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. const int maxn = 2e5 + 10;
  4. int degree[maxn];
  5. vector<int> e[maxn];
  6. int ans[maxn];
  7. int cnt;
  8. int n, m;
  9. priority_queue<int, vector<int>, greater<int>> q;
  10. void add(int u, int v)
  11. {
  12. degree[v] += 1;
  13. e[u].push_back(v);
  14. }
  15. void toposort()
  16. {
  17. for (int i = 1; i <= n; i++)
  18. {
  19. if (degree[i] == 0)
  20. {
  21. q.push(i);
  22. }
  23. }
  24. while (!q.empty())
  25. {
  26. int x = q.top();
  27. q.pop();
  28. ans[++cnt] = x;
  29. for (auto i : e[x])
  30. {
  31. degree[i]--;
  32. if (degree[i] == 0)
  33. {
  34. q.push(i);
  35. }
  36. }
  37. }
  38. }
  39. int main()
  40. {
  41. ios::sync_with_stdio(0);
  42. cin.tie(0);
  43. cout.tie(0);
  44. cin >> n >> m;
  45. for (int i = 1; i <= m; i++)
  46. {
  47. int u, v;
  48. cin >> u >> v;
  49. add(u, v);
  50. }
  51. toposort();
  52. if (cnt != n)
  53. {
  54. cout << -1 << endl;
  55. return 0;
  56. }
  57. for (int i = 1; i <= n; i++)
  58. {
  59. cout << ans[i] << ' ';
  60. }
  61. cout << endl;
  62. return 0;
  63. }

E - Placing Rectangles

思路分析:

  • 我人傻了,一开始以为是边界分析问题,先安排面积最大的,其次是次大的,最后是最小的,但是wa且t了,想了很久没有想出来,就参考了官方题解补了这个题,我解释一遍官方题解的意思。
  • 第一个图说的是当我们有两个矩形时如果要满足题目的意思的话,我们必定可以找到一条平行于\(X\)轴或者\(Y\)轴的直线,把所给的区域分为两个部分,这两个部分每一个都有一个矩形。
  • 那么直线也就有两种情况,如果直线平行于\(X\)轴,我们直接把S这个矩形压到x轴上,那么求一下剩余的\(X\)的长度即为\(S\)的面积除以\(y\)轴长度(注意向上取整),反之亦然。
  • 三个矩形的话在两个矩形上来做就简单了,我们要把这三个矩形分为两个部分,一个部分放一个矩形,另外一个放两个矩形,看看是否满足条件即可。

官方题解的图的解释:

  • 1、两个矩形的时候我们去找线,可以找到好几条,但是如果要满足条件的话,剩下的一个矩形必然不能存在于两个红色部分当中(很显然的),实际上做的时候是把这个矩形压到轴上。

  • 2、三个矩形就在两个矩形的基础上就可以,这幅图就是说先把两个矩形安排了,然后安排剩下的一个矩形,实际上我们先安排一个是一样的,它这个图这样画是便于理解。

  • 3、这种情况就是上面部分两个或者是下面部分两个。
  • 4、这种一样的。

  • 那么有同学会想会不会讨论不完全,其实是很完全的。
  • 首先我们选了三种矩形各占一块的时候实际上就已经有了两种,即分别将这三个矩形压到\(x\)或者\(y\)轴,然后在判断剩下两个矩形又有两种,一共就是\(C_3^1* 2*2 = 12\)种情况,我们可以看到这样是肯定讨论完全的了。

代码如下:

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define ll long long
  4. bool solve2(ll X, ll Y, ll S, ll T)
  5. {
  6. for (int i = 0; i < 2; i++)
  7. {
  8. ll len = (S + X - 1) / X;
  9. //求剩下的长度
  10. if (len < Y && X * (Y - len) >= T)
  11. {
  12. return 1;
  13. }
  14. //如果这个长度小于与这个轴垂直的轴的长度,并且剩下部分面积大于我们另一个矩形的面积的话
  15. swap(X, Y);
  16. //有两种情况
  17. }
  18. return 0;
  19. }
  20. bool solve3(ll X, ll Y, ll a, ll b, ll c)
  21. {
  22. for (int i = 0; i < 2; i++)
  23. {
  24. for (int j = 0; j < 3; j++)
  25. {
  26. ll len = (a + X - 1) / X;
  27. //也就是说先安排了一个,然后搞剩下的两个
  28. if (len < Y && solve2(X, Y - len, b, c))
  29. {
  30. return 1;
  31. }
  32. swap(a, b);
  33. swap(b, c);
  34. //这里是有三种情况的,我们安排其中一个,三个就是三种
  35. }
  36. swap(X, Y);
  37. //和solve2一样,大情况两种
  38. }
  39. return 0;
  40. }
  41. int main()
  42. {
  43. ll X, Y, a, b, c;
  44. cin >> X >> Y >> a >> b >> c;
  45. cout << ((solve3(X, Y, a, b, c) == 1) ? "Yes" : "No") << endl;
  46. return 0;
  47. }

AtCoder Beginner Contest 223的更多相关文章

  1. AtCoder Beginner Contest 100 2018/06/16

    A - Happy Birthday! Time limit : 2sec / Memory limit : 1000MB Score: 100 points Problem Statement E8 ...

  2. AtCoder Beginner Contest 052

    没看到Beginner,然后就做啊做,发现A,B太简单了...然后想想做完算了..没想到C卡了一下,然后还是做出来了.D的话瞎想了一下,然后感觉也没问题.假装all kill.2333 AtCoder ...

  3. AtCoder Beginner Contest 053 ABCD题

    A - ABC/ARC Time limit : 2sec / Memory limit : 256MB Score : 100 points Problem Statement Smeke has ...

  4. AtCoder Beginner Contest 136

    AtCoder Beginner Contest 136 题目链接 A - +-x 直接取\(max\)即可. Code #include <bits/stdc++.h> using na ...

  5. AtCoder Beginner Contest 137 F

    AtCoder Beginner Contest 137 F 数论鬼题(虽然不算特别数论) 希望你在浏览这篇题解前已经知道了费马小定理 利用用费马小定理构造函数\(g(x)=(x-i)^{P-1}\) ...

  6. AtCoder Beginner Contest 076

    A - Rating Goal Time limit : 2sec / Memory limit : 256MB Score : 100 points Problem Statement Takaha ...

  7. AtCoder Beginner Contest 079 D - Wall【Warshall Floyd algorithm】

    AtCoder Beginner Contest 079 D - Wall Warshall Floyd 最短路....先枚举 k #include<iostream> #include& ...

  8. AtCoder Beginner Contest 064 D - Insertion

    AtCoder Beginner Contest 064 D - Insertion Problem Statement You are given a string S of length N co ...

  9. AtCoder Beginner Contest 075 D - Axis-Parallel Rectangle【暴力】

    AtCoder Beginner Contest 075 D - Axis-Parallel Rectangle 我要崩溃,当时还以为是需要什么离散化的,原来是暴力,特么五层循环....我自己写怎么都 ...

随机推荐

  1. 【Python机器学习实战】决策树与集成学习(五)——集成学习(3)GBDT应用实例

    前面对GBDT的算法原理进行了描述,通过前文了解到GBDT是以回归树为基分类器的集成学习模型,既可以做分类,也可以做回归,由于GBDT设计很多CART决策树相关内容,就暂不对其算法流程进行实现,本节就 ...

  2. 免费 CDN 玩法 —— 将整个网站打包成一个图片文件

    资源合并 前端开发者都知道,过多的请求对性能影响很大.而且有些 CDN 不仅按流量收费,请求数也收费,如果网页里有大量小文件,显然不划算. 为此不少开发者将零碎的小文件进行合并优化,例如 JS/CSS ...

  3. 痞子衡嵌入式:MCUXpresso IDE下将关键函数重定向到RAM中执行的几种方法

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是MCUXpresso IDE下将关键函数重定向到RAM中执行的几种方法. 前段时间痞子衡写了一篇 <在IAR开发环境下将关键函数重 ...

  4. Vue获取Abp VNext Token

    Abp VNext默认没公开访问Token的Api,但有个问题Cookie方式如果是手机或桌面程序不如Token方便 Axios默认是Json方式提交,abp登录需要使用application/x-w ...

  5. SpringBoot-Web-初见

    目录 怎么开发一个网站? 静态资源 找到静态资源的存放目录 扩展自定义路径 首页定制 模板引擎Thymeleaf 员工管理系统-初见 国际化 国际化实现 编写国际化配置类 登陆功能 编写index.h ...

  6. 网站URL如何SEO优化

    前言 本文讲解网站的URL如何进行SEO优化,并在自己的WordPress博客echeverra中优化URL. 起因 对于SEO我了解的并不多,只知道SEO做的好,那么各大搜索网站搜索你网站相关内容时 ...

  7. c++ 打包函数教程

    c++当要重复运行一些代码时可以打包一个函数 当没有返回值时用void打包函数: #include <iostream> #include <stdio.h> using na ...

  8. 【PHP数据结构】队列的相关逻辑操作

    在逻辑结构中,我们已经学习了一个非常经典的结构类型:栈.今天,我们就来学习另外一个也是非常经典的逻辑结构类型:队列.相信不少同学已经使用过 redis . rabbitmq 之类的缓存队列工具.其实, ...

  9. P3273-[SCOI2011]棘手的操作【线段树,并查集】

    正题 题目链接:https://www.luogu.com.cn/problem/P3273 题目大意 \(n\)个点有权值,要求支持操作 连接两个点 单点加权 联通块加权 全图加权 单点询问 联通块 ...

  10. Visual Studio Code (VSCode) 配置 C/C++ 开发编译环境

    前言 工作多年,突然发现很多C++的基础都忘记了,加之C++不断更新换代后的各种新特性,于是想重拾C++的基础学习.虽然现在工作都是Linux平台,但考虑到个人方便,自己也仅仅想重温语法,家里家外都可 ...