博客
关于我
Codeforces Round #674 (Div. 3) (A - F题题解)
阅读量:399 次
发布时间:2019-03-06

本文共 5642 字,大约阅读时间需要 18 分钟。

A. Floor Number

题意:

一个楼房房间号由 \(1\) 递增,一楼仅2个房间。给定一位用户的房间号和 \(2\)楼以上每层的房间数\(x\)

求出用户所在楼层

思路:

很简单,理解题意即可。

如果 \(n≤2\) ,则答案为1。否则,您可以“删除”第一层,然后答案为 \(⌊\frac{n-3}{x}⌋+ 2。\)

#pythonfor i in range(int(input())):    n, x = map(int, input().split())    print(1 if n <= 2 else (n - 3) // x + 2)
#include
using namespace std;typedef long long ll;int main() { //freopen("in.txt", "r", stdin); ios_base::sync_with_stdio(false), cin.tie(0), cout.tie(0); int _; cin >> _; while (_--) { ll n, x; cin >> n >> x; if (n <= 2)cout << 1 << endl; else cout << (n - 3) / x + 2 << endl; }}

B. Symmetric Matrix

题目有点长,大家点击链接看原题 或者 题意↓

题意:

给定 n 种 2 x 2大小的方块,问是否能通过这些方块组成 m x m的矩形(需要 \(s[i][k] = s[j][i]\))

思路:

首先,如果m为奇数,则出于显而易见的原因,答案为“否”。 否则,我们会注意到图块的左上角和右下角值无关紧要(因为我们可以对称放置图块)。 因此,我们只需要检查是否有一些图块的右上值等于其左下值(因为这是我们获得主对角线对称性的方式)。

#pythonfor i in range(int(input())):	n, m = map(int, input().split())	a = []	for i in range(n):		a.append([[int(x) for x in input().split()] for i in range(2)])	ok = False	for i in range(n):		ok |= a[i][0][1] == a[i][1][0]	ok &= m % 2 == 0	print("YES" if ok else "NO")
#include
using namespace std;typedef long long ll;void solve() { ll n, m; cin >> n >> m; ll a, b, c, d; bool f1 = 0, f2 = 0; for (int i = 1; i <= n; ++i) { cin >> a >> b >> c >> d; if (!f2 && b == c)f2 = 1; } if (m % 2 == 0)f1 = 1; if (f1 && f2)cout << "YES" << endl; else cout << "NO" << endl;}int main() { //freopen("in.txt", "r", stdin); ios_base::sync_with_stdio(false), cin.tie(0), cout.tie(0); int _; cin >> _; while (_--)solve();}

C. Increase and Copy

题意:

思路:

直观地说,我们首先需要进行所有增量操作,然后才需要复制数字(因为否则我们可以交换移动顺序,并且总和不会减少)。 您可能会注意到答案不超过 \(O(\sqrt{n})\),所以我们可以从1迭代到⌊\(O(\sqrt{n})\)⌋,然后确定要复制的数字。 设为x。 那么我们需要x-1个移动来获得它,还需要⌈\(\frac{n-x}x\)⌉个移动来获得足够数量的副本。 因此,我们可以用此举数来更新答案。

时间复杂度:每个测试用例为\(O(\sqrt{n})\)
实际上,所需的数字总是非常接近⌊\(O(\sqrt{n})\)⌋,因此只要尝试在[⌊\(O(\sqrt{n})\)⌋-5; ⌊\(O(\sqrt{n})\)⌋ + 5]范围内进行一些选择就足够了。 回答。 这是 \(O(1)\)解决方案。

#include
using namespace std;int main() { //freopen("in.txt", "r", stdin); ios_base::sync_with_stdio(false), cin.tie(0), cout.tie(0); int t; cin >> t; while (t--) { int n; cin >> n; int ans = 1e9; for (int x = 1; x * x <= n; ++x) { ans = min(ans, x - 1 + ((n - x) + x - 1) / x); } cout << ans << endl; }}

D. Non-zero Segments

从开始遍历,利用sum去统计前面一段的值。

如果已经出现过,说明会导致有区间和为0的情况出现,ans++并且map clear 重新计数 sum从当前开始.

#include
using namespace std;typedef long long ll;int main() { //freopen("in.txt", "r", stdin); ios_base::sync_with_stdio(false), cin.tie(0), cout.tie(0); int n; cin >> n; map
m; ll ans = 0, sum = 0, x; m[0]++; for (int i = 0; i < n; ++i) { cin >> x; sum += x; if (m[sum] > 0) { ans++; sum = x; m.clear(); m[0]++; } m[sum]++; } cout << ans;}

E. Rock, Paper, Scissors

Alice 和 Bob这次开始玩猜拳了,给定他们玩的次数n,和石头剪刀布出现的次数,求Alice能赢的最多次数和最少次数。

思路:

赢最多不用说吧?

赢最少, 无非是 拳头被拳头和包吃了, 剪刀被剪刀和石头吃了, 包被拳头和包吃了

抵消完后, 要么你剩下拳头/剪刀/包, 对手剩下剪刀/包/拳头, 这就是你最少赢的

#include
using namespace std;typedef long long ll;ll q_max(ll x, ll y, ll z, ll h) { x = x > y ? x : y; x = x > z ? x : z; x = x > h ? x : h; return x;}int main() { //freopen("in.txt", "r", stdin); ios_base::sync_with_stdio(false), cin.tie(0), cout.tie(0); ll n, a, b, c, x, y, z; cin >> n; cin >> a >> b >> c >> x >> y >> z; cout << q_max(0, a - x - z, b - x - y, c - y - z ) << " " << min(a, y) + min(b, z) + min(c, x);}

F. Number of Subsequences

没做出来

先贴一下dalao的代码留做学习

#include
using namespace std;const int mod = 1e9 + 7;typedef ll ll;int main() { int n; cin >> n; string ss; cin >> ss; ll x = 0; ll ans = 0; ll temp = 0; ll num = 1; for (int i = 0; i < n; i++) { if (ss[i] == 'a') x += num; else if (ss[i] == 'b') temp += x; else if (ss[i] == 'c') ans += temp; else { ans = ans * 3 + temp; temp = temp * 3 + x; x = x * 3 + num; num *= 3; } num %= mod; x %= mod; temp %= mod; ans %= mod; } cout << ans << endl;}

学习隔壁 洛绫璃dalao 的写法:

利用模拟思想:

题目问我们能组成 abc 的可能性,需要在3^k的情况取模

先把可能的情况标出来以后再处理

1~~a2~~?3~~ab4~~a?5~~?b6~~??7~~abc8~~ab?9~~a?c10~~?bc11~~a??12~~?b?13~~??c14~~???
#include 
#define rep(i,a,b) for(int i=(a);i<=(b);++i)#define IOS ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr)using namespace std;typedef long long ll;const int N = 2e5 + 5, mod = 1e9 + 7;int n, m, _, k;char s[N];ll a[20], ans = 0;int qpow(ll a, ll b) {//快速幂 ll ans = 1; a %= mod; for (; b; a = a * a % mod, b >>= 1) if (b & 1) ans = ans * a % mod; return ans;}int main() { IOS; cin >> n; cin >> s + 1; rep(i, 1, n) if (s[i] == 'a') ++a[1]; else if (s[i] == 'b') { a[3] += a[1]; a[5] += a[2]; } else if (s[i] == 'c') { a[7] += a[3]; a[9] += a[4]; a[10] += a[5]; a[13] += a[6]; } else { a[14] += a[6]; a[12] += a[5]; a[11] += a[4]; a[8] += a[3]; a[6] += a[2]; a[4] += a[1]; ++a[2]; } //如果存在这种可能性,利用相应组合计算 if (a[7]) ans = a[7] % mod * qpow(3, a[2]) % mod; if (a[8]) ans = (ans + a[8] % mod * qpow(3, a[2] - 1) % mod) % mod; if (a[9]) ans = (ans + a[9] % mod * qpow(3, a[2] - 1) % mod) % mod; if (a[10]) ans = (ans + a[10] % mod * qpow(3, a[2] - 1) % mod) % mod; if (a[11]) ans = (ans + a[11] % mod * qpow(3, a[2] - 2) % mod) % mod; if (a[12]) ans = (ans + a[12] % mod * qpow(3, a[2] - 2) % mod) % mod; if (a[13]) ans = (ans + a[13] % mod * qpow(3, a[2] - 2) % mod) % mod; if (a[14]) ans = (ans + a[14] % mod * qpow(3, a[2] - 3) % mod) % mod; cout << ans; return 0;}

转载地址:http://ocykz.baihongyu.com/

你可能感兴趣的文章
Linux上TCP的几个内核参数调优
查看>>
记一次讲故事机器人的开发-我有故事,让机器人来读
查看>>
seo 回忆录百度基本概念(一)
查看>>
kettle 执行 kjb 临时文件夹 /tmp permission denied 问题
查看>>
netcore中使用session
查看>>
Android 开发学习进程0.25 自定义控件
查看>>
多媒体文件格式全解说(下)--图片
查看>>
淘宝WAP版小BUG分析
查看>>
asp.net打印网页后自动关闭网页【无需插件】
查看>>
【Maven】POM基本概念
查看>>
【Java思考】Java 中的实参与形参之间的传递到底是值传递还是引用传递呢?
查看>>
【设计模式】单例模式
查看>>
远程触发Jenkins的Pipeline任务的并发问题处理
查看>>
entity framework core在独立类库下执行迁移操作
查看>>
Asp.Net Core 2.1+的视图缓存(响应缓存)
查看>>
【wp】HWS计划2021硬件安全冬令营线上选拔赛
查看>>
Ef+T4模板实现代码快速生成器
查看>>
JQuery选择器
查看>>
Java面试题:Servlet是线程安全的吗?
查看>>
Java集合总结系列2:Collection接口
查看>>