ABC245 A~E

  • [A - Good morning](https://atcoder.jp/contests/abc245/tasks/abc245_a)
    • 题目大意
    • 输入格式
    • 输出格式
    • 样例
    • 分析
    • 代码
  • [B - Mex](https://atcoder.jp/contests/abc245/tasks/abc245_b)
    • 题目大意
    • 输入格式
    • 输出格式
    • 样例
    • 分析
    • 代码
  • [C - Choose Elements](https://atcoder.jp/contests/abc245/tasks/abc245_c)
    • 题目大意
    • 输入格式
    • 输出格式
    • 样例
    • 分析
    • 代码
  • [D - Polynomial division](https://atcoder.jp/contests/abc245/tasks/abc245_d)
    • 题目大意
    • 输入格式
    • 输出格式
    • 样例
    • 分析
    • 代码
  • [E - Wrapping Chocolate](https://atcoder.jp/contests/abc245/tasks/abc245_e)
    • 题目大意
    • 输入格式
    • 输出格式
    • 分析
    • 代码

A - Good morning

题目大意

在同一天里,Takahashi在AAA时BBB分起床,Aoki在CCC时DDD分111秒起床,请问谁起床更早?

0≤A,C<240\le A,C<240≤A,C<24
0≤B,D<600\le B,D<600≤B,D<60

输入格式

ABCDA~B~C~DA B C D

输出格式

输出起得更早的人的名字(TakahashiAoki)。

样例

AAA BBB CCC DDD 输出
777 000 666 303030 Aoki
777 303030 777 303030 Takahashi
000 000 232323 595959 Takahashi

分析

思路很明显,直接判断(A,B)≤(C,D)(A,B)\le(C,D)(A,B)≤(C,D)是否成立即可。

代码

#include <cstdio>
using namespace std;int main()
{int a, b, c, d;scanf("%d%d%d%d", &a, &b, &c, &d);puts((a == c? b <= d: a < c)? "Takahashi": "Aoki");return 0;
}

B - Mex

题目大意

给定整数序列A=(A1,…,AN)A=(A_1,\dots,A_N)A=(A1​,…,AN​)。求最小的不在AAA中的自然数。

1≤N≤20001\le N\le 20001≤N≤2000
0≤Ai≤20000\le A_i\le 20000≤Ai​≤2000

输入格式

NNN
A1…ANA_1~\dots~A_NA1​ … AN​

输出格式

输出一行,即最小的不在AAA中的自然数。

样例

略,请自行前往AtCoder查看

分析

由于题面中有限制0≤Ai≤20000\le A_i\le 20000≤Ai​≤2000,所以我们直接开一个数组记录[0,2001][0,2001][0,2001]中每个数是否出现过即可。
本题方法很多,这里介绍的是最快的算法,时间复杂度O(N)\mathcal O(N)O(N)。

代码

#include <cstdio>
using namespace std;bool used[2005];int main()
{int n;scanf("%d", &n);while(n--){int a;scanf("%d", &a);used[a] = true;}int i = -1;while(used[++i]);printf("%d\n", i);return 0;
}

C - Choose Elements

题目大意

给定两个长度为NNN的整数序列A=(A1,…,AN)A=(A_1,\dots,A_N)A=(A1​,…,AN​)和B=(B1,…,BN)B=(B_1,\dots,B_N)B=(B1​,…,BN​)。
问是否存在序列X=(X1,…,XN)X=(X_1,\dots,X_N)X=(X1​,…,XN​),满足如下条件:

  • Xi=AiX_i=A_iXi​=Ai​或Xi=BiX_i=B_iXi​=Bi​
  • ∣Xi−Xi+1∣≤K|X_i-X_{i+1}|\le K∣Xi​−Xi+1​∣≤K,其中1≤i<N1\le i<N1≤i<N

1≤N≤2×1051\le N\le 2\times 10^51≤N≤2×105
1≤K≤1091\le K\le 10^91≤K≤109
1≤Ai,Bi≤1091\le A_i,B_i\le 10^91≤Ai​,Bi​≤109

输入格式

NKN~KN K
A1…ANA_1~\dots~A_NA1​ … AN​
B1…BNB_1~\dots~B_NB1​ … BN​

输出格式

如果存在符合全部条件的XXX,输出Yes;否则,输出No

样例

略,请自行前往AtCoder查看

分析

好家伙,C题都要用dp……
本题普通的方法貌似不太好做,因此我们考虑DP\text{DP}DP。
令f(i)=Xif(i)=X_if(i)=Xi​选择能否等于AiA_iAi​,g(i)=Xig(i)=X_ig(i)=Xi​能否等于BiB_iBi​。
然后状态转移方程就简单了,详见代码。

代码

#include <cstdio>
#define maxn 200005
using namespace std;int a[maxn], b[maxn];
bool f[maxn], g[maxn];int main()
{int n, k;scanf("%d%d", &n, &k);for(int i=0; i<n; i++)scanf("%d", a + i);for(int i=0; i<n; i++)scanf("%d", b + i);f[0] = g[0] = true;
#define set(x, y, z) x |= y - z <= k && z - y <= kfor(int i=1; i<n; i++){if(f[i - 1])set(f[i], a[i - 1], a[i]),set(g[i], a[i - 1], b[i]);if(g[i - 1])set(f[i], b[i - 1], a[i]),set(g[i], b[i - 1], b[i]);}puts(f[n - 1] || g[n - 1]? "Yes": "No");return 0;
}

注:本题还有一种很奇怪的解法,就是直接判断相邻的四种连接方式是否有至少一种能连通,比如#30453703,如果有大佬能证明这种方法的正确性,欢迎在评论区留言告诉我,谢谢!


D - Polynomial division

题目大意

我们有三个多项式
A(x)=∑i=0NAiXiB(x)=∑i=0MBiXiC(x)=∑i=0N+MBiXiA(x)=\sum_{i=0}^N A_iX^i\\ B(x)=\sum_{i=0}^M B_iX^i\\ C(x)=\sum_{i=0}^{N+M} B_iX^i A(x)=i=0∑N​Ai​XiB(x)=i=0∑M​Bi​XiC(x)=i=0∑N+M​Bi​Xi
已知A0,…,ANA_0,\dots,A_NA0​,…,AN​和C0,…,CNC_0,\dots,C_NC0​,…,CN​且A(x)×B(x)=C(x)A(x)\times B(x)=C(x)A(x)×B(x)=C(x)(x∈Rx\in Rx∈R),求B0,…,BMB_0,\dots,B_MB0​,…,BM​。
换句话说,给定多项式AAA和CCC每一项的系数,求多项式B=CAB=\frac C AB=AC​。

1≤N,M<1001\le N,M<1001≤N,M<100
∣Ai∣≤100|A_i|\le 100∣Ai​∣≤100
∣Ci∣≤106|C_i|\le 10^6∣Ci​∣≤106
AN≠0,CN+M≠0A_N\ne0,C_{N+M}\ne0AN​=0,CN+M​=0
题目保证存在合法的(B0,…,BM)(B_0,\dots,B_M)(B0​,…,BM​)。

输入格式

NMN~MN M
A0…ANA_0~\dots~A_NA0​ … AN​
C0…CN+MC_0~\dots~C_{N+M}C0​ … CN+M​

输出格式

输出B0,…,BMB_0,\dots,B_MB0​,…,BM​,用空格分隔。

样例

略,请自行前往AtCoder查看

分析

本题可以直接模拟多项式的大除法运算,运算时只需记录系数即可。

代码

#include <cstdio>
#define maxn 105
using namespace std;int a[maxn], b[maxn], c[maxn << 1];int main()
{int n, m;scanf("%d%d", &n, &m);for(int i=0; i<=n; i++) scanf("%d", a + i);for(int i=0; i<=n+m; i++) scanf("%d", c + i);for(int i=m; i>=0; i--) // NOTE: 必须倒推!{b[i] = c[n + i] / a[n];for(int j=0; j<=n; j++)c[i + j] -= a[j] * b[i];}for(int i=0; i<=m; i++)printf("%d ", b[i]);return 0;
}

E - Wrapping Chocolate

题目大意

我们有NNN块巧克力和MMM个盒子。第iii块巧克力长AiA_iAi​厘米,宽BiB_iBi​厘米;第iii个盒子长CiC_iCi​厘米,宽DiD_iDi​厘米。
问是否能把巧克力分别装在盒子里,使其满足如下条件:

  • 每个盒子里只能有一块巧克力。
  • 当我们将第iii块巧克力放入第jjj个盒子里时,Ai≤CjA_i\le C_jAi​≤Cj​和Bi≤DjB_i\le D_jBi​≤Dj​必须都成立。

1≤N≤M≤2×1051\le N\le M\le 2\times10^51≤N≤M≤2×105
1≤Ai,Bi,Ci,Di≤1091\le A_i,B_i,C_i,D_i\le 10^91≤Ai​,Bi​,Ci​,Di​≤109

输入格式

NMN~MN M
A1…ANA_1~\dots~A_NA1​ … AN​
B1…BNB_1~\dots~B_NB1​ … BN​
C1…CNC_1~\dots~C_NC1​ … CN​
D1…DND_1~\dots~D_ND1​ … DN​

输出格式

如果有合法的方法,输出Yes;否则,输出No

分析

本题可以考虑如下贪心算法:

  1. 将所有的巧克力和盒子放入一个数组,按长度(AiA_iAi​或CiC_iCi​)的降序排序,长度相等的把盒子排在前面。
  2. 准备好一个空序列S=()S=()S=(),按如下规则遍历每个元素:
    • 如果当前遍历的是一个盒子(Ci,Di)(C_i,D_i)(Ci​,Di​):
      将DiD_iDi​加入SSS。
    • 如果当前遍历的是一块巧克力(Ai,Bi)(A_i,B_i)(Ai​,Bi​):
      从SSS中删除不超过BiB_iBi​的最小元素,如果没有元素可删除,输出No
  3. 如果顺利地遍历了所有元素,输出Yes;否则,输出No

本算法的时间复杂度是O(MN)\mathcal O(MN)O(MN),但经过multiset优化后可降为O((M+N)log⁡(M+N)\mathcal O((M+N)\log(M+N)O((M+N)log(M+N),具体实现详见代码。

代码

#include <cstdio>
#include <set>
#include <algorithm>
using namespace std;struct Item {int w, h;bool type;inline bool operator <(const Item& i2) const {return w == i2.w? type > i2.type: w > i2.w;//                ^^^^^^^^^^^^^^// 注意sort必须有严格顺序,一开始我这里写成了type==1导致RE,详见:// https://atcoder.jp/contests/abc245/submissions/30526563}
} v[400005];int main()
{int n, m;scanf("%d%d", &n, &m);// Chocolatefor(int i=0; i<n; i++) scanf("%d", &v[i].w);for(int i=0; i<n; i++) scanf("%d", &v[i].h);// Boxm += n;for(int i=n; i<m; i++) scanf("%d", &v[i].w);for(int i=n; i<m; i++) scanf("%d", &v[i].h);for(int i=n; i<m; i++) v[i].type = 1;// Algorithmsort(v, v + m);multiset<int> s;for(int i=0; i<m; i++){const Item& it = v[i];if(it.type) s.insert(it.h); // Boxelse{auto itr = s.lower_bound(it.h);if(itr == s.end()){puts("No");return 0;}s.erase(itr);}}puts("Yes");return 0;
}

AtCoder Beginner Contest 245 A~E 题解相关推荐

  1. AtCoder Beginner Contest 245

    AtCoder Beginner Contest 245 文章目录 AtCoder Beginner Contest 245 A - Good morning B - Mex C - Choose E ...

  2. AtCoder Beginner Contest 246 A~E 题解 Bishop 2

    AtCoder Beginner Contest 246 A~E 题解 A Four Points 题意 给你矩形的三个顶点,输出剩下那个 思路 把横坐标和纵坐标分开,必会存在两个相同的数,横纵坐标就 ...

  3. AtCoder Beginner Contest 252 A~G 题解

    前言 这是我第一次写7题(A~G)的ABC题解,若有写得不好或者不到位的地方请多多指教,我将万分感激,感谢大家的支持! ABC252 A~G [A - ASCII code](https://atco ...

  4. AtCoder Beginner Contest 196 A~E题解

    ABC196 A~E [A - Difference Max](https://atcoder.jp/contests/abc196/tasks/abc196_a) 题目大意 输入格式 输出格式 样例 ...

  5. AtCoder Beginner Contest 177 A~D 题解

    ABC177 A~D [A - Don't be late](https://atcoder.jp/contests/abc177/tasks/abc177_a) 题目大意 输入格式 输出格式 样例 ...

  6. AtCoder Beginner Contest 168 C~D题解

    ABC168 C&D [C - : (Colon)](https://atcoder.jp/contests/abc168/tasks/abc168_c) 题目大意 输入格式 输出格式 样例 ...

  7. AtCoder Beginner Contest 242 C~E 题解

    ABC242 C~E [C - 1111gal password](https://atcoder.jp/contests/abc242/tasks/abc242_c) 题目大意 输入格式 输出格式 ...

  8. AtCoder Beginner Contest 250 C~E 题解

    ABC250 C~E [C - Adjacent Swaps](https://atcoder.jp/contests/abc250/tasks/abc250_c) 题目大意 输入格式 输出格式 样例 ...

  9. AtCoder Beginner Contest 192 A~D题解

    ABC192 A~D [A - Star](https://atcoder.jp/contests/abc192/tasks/abc192_a) 题目大意 输入格式 输出格式 样例 分析 代码 [B ...

  10. AtCoder Beginner Contest 254 A~E 题解

    ABC254 A~E [A - Last Two Digits](https://atcoder.jp/contests/abc254/tasks/abc254_a) 题目大意 输入格式 输出格式 样 ...

最新文章

  1. Python3中__call__方法介绍
  2. 【数学与算法】牛顿法的两种应用:求根和最优化
  3. PHP二维数组排序函数
  4. 【渝粤题库】广东开放大学 质量管理 形成性考核 (2)
  5. vue实现可编辑的文字_苹果还自带文字转语音,只要一键按下便可实现,今天分享给大家...
  6. JavaEE实战班第十七天
  7. linux驱动中使用定时器的设置
  8. ImportError: No module named MySQLdb
  9. 非线性鲁棒控制器_Sliding Mode_滑模控制
  10. NOIP模拟赛 czy的后宫4
  11. 机器人运动控制-水下机器人
  12. luci实现的wifidog认证服务
  13. C++基础笔记(一)
  14. 使用 JABX 将 Map<String,String> 序列化成 <key>value</key>形式的字符串
  15. 咱也谈谈如何炒股,如何买股票呗。
  16. 信息与计算机工程学院英文翻译,成都信息工程学院通信工程学院英文翻译.doc...
  17. 软件工程 第一章 软件工程概述
  18. 凭栏听音,化险为夷——配电系统中的电磁隐患解析
  19. ADC VS参考电压在测量时和AD值的大小对应关系
  20. 51单片机~串口通信(讲解+代码)

热门文章

  1. java中public static void main(String args[])具体是什么意思?
  2. linux中文成方块,给linux添加字体
  3. 组成计算机硬件系统的基本部分为,组成计算机硬件系统的基本部分有哪些
  4. CMake Error: The source directory * does not appear to contain CMakeLists.txt.
  5. 开源人物之九:赖霖枫
  6. Orientation模块管理设备的方向信息,包括alpha、beta、gamma三个方向信息,通过plus.orientation可获取设备方向管理对象
  7. 厦门大学计算机考研复试线2021,2021浙江大学、中科大、厦门大学考研复试分数线公布!...
  8. The firefox installs flashplugin for Linux
  9. linux quota原理,[转载]linux下quota实现
  10. audio标签控制音量_audio 基本功能实现(audio停止播放,audio如何静音,audio音量控制等)...