Codeforces Round #583 (Div. 1 + Div. 2, based on Olympiad of Metropolises)
A. Optimal Currency Exchange
枚举一下就行了。
Code
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int n, a, b;
int main() {
ios::sync_with_stdio(false); cin.tie(0);
cin >> n >> a >> b; b *= 5;
int ans = n;
for(int x = 1; x * b <= n; ++x) {
ans = min(ans, (n - x * b) % a);
}
for(int x = 1; x * a <= n; ++x) {
ans = min(ans, (n - x * a) % b);
}
cout << ans;
return 0;
}
B. Badges
同样也是枚举,注意边界情况。
Code
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int b, g, n;
int main() {
ios::sync_with_stdio(false); cin.tie(0);
cin >> b >> g >> n;
int mn = min(b, g);
int mx = max(g, b);
int ans = 0;
for(int i = mn; ~i; i--) {
int j = n - i;
if(j <= mx && j >= 0) ans++ ;
}
cout << ans;
return 0;
}
C. Bad Sequence
水题,有很多做法,最简单的做法就是维护一个类似前缀和的形式,题目的条件就相当于在任何一个位置,')'的数量不会比'('的数量多1。
Code
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 200005;
int n;
char s[N];
char q[N];
int main() {
ios::sync_with_stdio(false); cin.tie(0);
// freopen("input.in", "r", stdin);
cin >> n >> s + 1;
int l = 1, r = 0;
for(int i = 1; i <= n; i++) {
if(l > r) q[++r] = s[i];
else {
if(s[i] == ')' && q[r] == '(') {
--r;
} else q[++r] = s[i];
}
}
int len = r - l + 1;
int f = 1;
if(len == 2) {
if(q[l] == ')' && q[r] == '(') {}
else f = 0;
} else if(len == 0) {}
else f = 0;
if(f) cout << "YES";
else cout << "NO";
return 0;
}
D. Treasure Island
题意:
给出一个\(n*m\)的网格图,现在要堵住一些点,使得从\((1,1)\)出发,每次只能向右走或者向下走,到不了\((n,m)\)。
问最少需要堵住多少点。
思路:
很显然答案不会大于\(2\)。那么我们就只需要判断答案是否可能为\(0,1\)就行。
- 考虑直接bfs,从起点出发一次,从终点出发一次。
- 合理性?
- 首先\(0\)的情况很好判断,我们就只需要判断答案是否有可能为\(1\);
- 假设网格图中存在一个点为必经点,那么可以观察到该点的左下部分和右上部分从两端点出发都不能同时到达。
然而我比赛时写得代码很丑陋= =其实点直接映射就好,写起来很方便;同时\(bfs\)也可以直接用循环代替。
Code
#include <bits/stdc++.h>
#define INF 0x3f3f3f3f
#define MP make_pair
#define fi first
#define se second
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
const int N = 1e6 + 5;
int n, m;
char s[N];
int dx[4] = {1, 0, -1, 0}, dy[4] = {0, 1, 0, -1};
bool ok(int x, int y) {
return x >= 1 && x <= n && y >= 1 && y <= m;
}
int main() {
ios::sync_with_stdio(false); cin.tie(0);
cin >> n >> m;
vector <vector <int> > a(n + 3), b(n + 3), c(n + 3), sum(n + 3);
vector <vector <vector <int> >> d(2);
for(int i = 0; i < 2; i++) {
d[i].resize(n + 3);
}
for(int i = 0; i <= n + 1; i++) {
d[0][i].resize(m + 3, INF);
d[1][i].resize(m + 3, INF);
}
for(int i = 0; i <= n + 1; i++)
a[i].resize(m + 3), b[i].resize(m + 3, 0), c[i].resize(m + 3, 0), sum[i].resize(m + 3, 0);
for(int i = 1; i <= n; i++) {
cin >> s + 1;
for(int j = 1; j <= m; j++) {
if(s[j] == '.') a[i][j] = 0;
else a[i][j] = 1;
}
}
vector <vector<int> > vis;
vis.resize(n + 2);
for(int i = 1; i <= n; i++) vis[i].resize(m + 2, 0);
queue <pii> q;
q.push(MP(1, 1));
vis[1][1] = 1; d[0][1][1] = 0;
while(!q.empty()) {
pii cur = q.front(); q.pop();
for(int i = 0; i < 2; i++) {
int curx = cur.fi + dx[i], cury = cur.se + dy[i];
if(ok(curx, cury) && !vis[curx][cury] && a[curx][cury] == 0) {
vis[curx][cury] = 1;
d[0][curx][cury] = d[0][cur.fi][cur.se] + 1;
q.push(MP(curx, cury));
}
}
}
if(d[0][n][m] == INF) {
cout << 0; return 0;
}
for(int i = 1; i <= n; i++) {
for(int j = 1; j <= m; j++) vis[i][j] = 0;
}
q.push(MP(n, m));
vis[n][m] = 1; d[1][n][m] = 0;
while(!q.empty()) {
pii cur = q.front(); q.pop();
for(int i = 2; i < 4; i++) {
int curx = cur.fi + dx[i], cury = cur.se + dy[i];
if(ok(curx, cury) && !vis[curx][cury] && a[curx][cury] == 0) {
vis[curx][cury] = 1;
d[1][curx][cury] = d[1][cur.fi][cur.se] + 1;
q.push(MP(curx, cury));
}
}
}
for(int i = 1; i <= n; i++) {
for(int j = 1; j <= m; j++) {
if(a[i][j]) continue;
sum[i][j] = d[0][i][j] + d[1][i][j];
if(sum[i][j] >= INF) sum[i][j] = 0;
}
}
for(int i = n; i; i--) {
for(int j = 1; j <= m; j++) {
b[i][j] = b[i + 1][j] + b[i][j - 1] - b[i + 1][j - 1] + sum[i][j];
}
}
for(int i = 1; i <= n; i++) {
for(int j = m; j; j--) {
c[i][j] = c[i - 1][j] + c[i][j + 1] - c[i - 1][j + 1] + sum[i][j];
}
}
int ans = 2;
for(int i = 1; i <= n; i++) {
for(int j = 1; j <= m; j++) {
if((i == 1 && j == 1) || (i == n && j == m)) continue;
// if(a[i][j] == 0 && b[min(i + 1, n)][max(j - 1, 1)] == 0 && c[max(i - 1, 1)][min(j + 1, m)] == 0) {
// ans = 1;
// }
if(a[i][j] == 0 && b[i + 1][j - 1] == 0 && c[i - 1][j + 1] == 0) ans = 1;
}
}
cout << ans;
return 0;
}
E. Petya and Construction Set
题意:
构造一颗\(2n\)个结点的树,满足\(2i,2i-1\)两个结点的距离为\(d_i,d_i\leq n\),\(d_i\)会给出。
思路:
(结点看成\(n\)个,想了一个假题)
- 注意到一个点只与与它配对的点有关。
- 考虑将这颗树构造成一条链+一些分支的形式。
- 首先我们构造一条长度为\(n\)的链,链上的结点为奇数结点,接下来我们要放偶数结点;
- 注意到任何长度的点,我们都可以搞一个分支出来。
- 但是,万一长度大于链的长度怎么办?
- 那直接将链长度加\(1\)即可,同时,我们可以按\(d_i\)降序的顺序来加边,这样可以方便很多。
细节见代码吧:
Code
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 2e5 + 5;
int n;
int d[N];
vector <int> g[N];
struct edge{
int u, v, w;
bool operator < (const edge &A) const {
return w > A.w;
}
}a[N];
int p[N];
int main() {
ios::sync_with_stdio(false); cin.tie(0);
cin >> n;
for(int i = 1; i <= n; i++) {
int u = 2 * i - 1, v = 2 * i;
cin >> d[i];
a[i] = {u, v, d[i]};
}
sort(a + 1, a + n + 1);
int MAX = n;
auto add = [&](int u, int v) {
g[u].push_back(v);
};
for(int i = 1; i <= n; i++) p[i] = a[i].u;
// for(int i = 1; i <= n; i++) cout << p[i] << ' ';
// cout << '\n';
for(int i = 1; i <= n; i++) {
if(i + a[i].w == MAX + 1) p[++MAX] = a[i].v;
add(p[i + a[i].w - 1], a[i].v);
if(i > 1) add(p[i - 1], p[i]);
}
for(int i = 1; i <= 2 * n; i++) {
for(auto it : g[i]) cout << i << ' ' << it << '\n';
}
return 0;
}
Codeforces Round #583 (Div. 1 + Div. 2, based on Olympiad of Metropolises)的更多相关文章
- Educational Codeforces Round 60 (Rated for Div. 2) - C. Magic Ship
Problem Educational Codeforces Round 60 (Rated for Div. 2) - C. Magic Ship Time Limit: 2000 mSec P ...
- Educational Codeforces Round 60 (Rated for Div. 2) - D. Magic Gems(动态规划+矩阵快速幂)
Problem Educational Codeforces Round 60 (Rated for Div. 2) - D. Magic Gems Time Limit: 3000 mSec P ...
- Educational Codeforces Round 43 (Rated for Div. 2)
Educational Codeforces Round 43 (Rated for Div. 2) https://codeforces.com/contest/976 A #include< ...
- Educational Codeforces Round 35 (Rated for Div. 2)
Educational Codeforces Round 35 (Rated for Div. 2) https://codeforces.com/contest/911 A 模拟 #include& ...
- Codeforces Educational Codeforces Round 44 (Rated for Div. 2) F. Isomorphic Strings
Codeforces Educational Codeforces Round 44 (Rated for Div. 2) F. Isomorphic Strings 题目连接: http://cod ...
- Codeforces Educational Codeforces Round 44 (Rated for Div. 2) E. Pencils and Boxes
Codeforces Educational Codeforces Round 44 (Rated for Div. 2) E. Pencils and Boxes 题目连接: http://code ...
- Educational Codeforces Round 63 (Rated for Div. 2) 题解
Educational Codeforces Round 63 (Rated for Div. 2)题解 题目链接 A. Reverse a Substring 给出一个字符串,现在可以对这个字符串进 ...
- Educational Codeforces Round 39 (Rated for Div. 2) G
Educational Codeforces Round 39 (Rated for Div. 2) G 题意: 给一个序列\(a_i(1 <= a_i <= 10^{9}),2 < ...
- Educational Codeforces Round 48 (Rated for Div. 2) CD题解
Educational Codeforces Round 48 (Rated for Div. 2) C. Vasya And The Mushrooms 题目链接:https://codeforce ...
- Educational Codeforces Round 60 (Rated for Div. 2) 题解
Educational Codeforces Round 60 (Rated for Div. 2) 题目链接:https://codeforces.com/contest/1117 A. Best ...
随机推荐
- Image 鼠标拖拽与鼠标中键的缩放
一.Image在窗体上拖拽,势必会用到鼠标的三个事件(MouseDown,MouseUp,MouseMove),以左键为例,PictureBox为载体 Point mouseDownPoint = n ...
- Consul初探-集成ocelot
前言 由于 Consul 的高可用性.丰富的API.友好的 Web 控制台界面等特点,Consul 的发展非常迅猛,得益于 .NETCore 社区的快速发展和社区成员的贡献,我们现在可以非常方便快速的 ...
- C# copy folder and files from source path to target path
static void Main(string[] args) { string sourceDir = @"E:\SourcePath"; string destDir = @& ...
- Axure制作dialog效果的动作步骤
1.在Axure中添加一个弹框按钮 2.将动态面版拖动到界面中 3.双击动态面版,双击state 4.拖入一块图片占位符进来 5.设置图片 6.回到上一个界面设置动态面版的大小,使其 ...
- 理解 Flutter 中的 Key
概览 在 Flutter 中,大概大家都知道如何更新界面视图: 通过修改 Stata 去触发 Widget 重建,触发和更新的操作是 Flutter 框架做的. 但是有时即使修改了 State,Flu ...
- Android 监听手机锁屏的工具类
自定义 ScreenListener package com.example.teagardenhd.Listener; import android.content.BroadcastReceive ...
- Python升级后ssl模块不可用问题解决和浅析
在Cent0S 7.5下将Python 2.7.5升级到Python 3.6.6后,发现ssl模块不可用,具体详细信息如下所示: [root@db-server ~]# pip list Packag ...
- sql server使用sp_executesql返回拼接字符串里面的输出参数
问题: 今天一同事请教博主,他拼接了一个语句,select表格形式数据,然后使用@@rowcount获取到行数. 但他又有这样特别的需求:想只获取行数而不返回表格数据结果,因为是while循环,不想返 ...
- docker工具之基本命令
docker工具之基本命令 1.docker服务的启动.停止.重启 systemctl start docker #启动docker服务 systemctl daemon-reload #守护进程重启 ...
- qt 自定义控件窗口提升