CF Round #516 (Div. 2, by Moscow Team Olympiad)
前言:依旧菜,\(A\)了\(4\)题,不过这次上蓝了挺开心的。
A. Make a triangle!
Description
给出\(3\)根木棍,希望用它们拼成三角形,可以将其中的某些木棍增长,求至少需要增长多少才能拼成一个三角形。
Solution
水题,答案就是最长的木棍长度减去剩下两根木棍的长度和再\(+1\),如果为负则输出\(0\)(即本来就能拼成三角形)。
#include<cstdio>
using namespace std;
inline int re()
{
int x = 0;
char c = getchar();
bool p = 0;
for (; c < '0' || c > '9'; c = getchar())
p |= c == '-';
for (; c >= '0' && c <= '9'; c = getchar())
x = x * 10 + c - '0';
return p ? -x : x;
}
inline void sw(int &x, int &y)
{
int z = x;
x = y;
y = z;
}
int main()
{
int a, b, c;
a = re();
b = re();
c = re();
if (a < b)
sw(a, b);
if (a < c)
sw(a, c);
if (b < c)
sw(b, c);
if (b + c > a)
printf("0");
else
printf("%d", a - b - c + 1);
}
B. Equations of Mathematical Magic
Description
给出\(a\),求方程\(a - (a\oplus x) - x = 0\)的解的个数(\(\oplus\)为\(xor\)操作)
Solution
找规律,样例很贴心的给出最大数,于是我大力猜结论,核对机房大佬的表后发现正确,非常愉快。
结论:设\(s\)为\(a\)在二进制下\(1\)的个数,则答案就是\(2^s\)。
然而并不会证明
#include<cstdio>
using namespace std;
inline int re()
{
int x = 0;
char c = getchar();
bool p = 0;
for (; c < '0' || c > '9'; c = getchar())
p |= c == '-';
for (; c >= '0' && c <= '9'; c = getchar())
x = x * 10 + c - '0';
return p ? -x : x;
}
int main()
{
int a, s, i, t = re();
while (t--)
{
s = 0;
a = re();
for (i = 30; ~i; i--)
if (a & (1 << i))
s++;
printf("%d\n", 1 << s);
}
return 0;
}
C. Oh Those Palindromes
Description
给你一个字符串,你可以任意改变串中字符的位置,求构造一个有最多回文子串的字符串。
Solution
构造题,一开始想的很复杂,然后打到一半,机房大佬突然说,只要将相同的字符扔在一起就好了。。
所以这题就是一个\(sort\)的事。。因为我是在打到一半的代码临时改的,所以直接在计数数组上构造了。
#include<cstdio>
using namespace std;
const int N = 1e5 + 10;
const int M = 300;
struct dd{
int s;
char c;
};
dd a[M];
int mp[M], l;
char an[N];
inline int re()
{
int x = 0;
char c = getchar();
bool p = 0;
for (; c < '0' || c > '9'; c = getchar())
p |= c == '-';
for (; c >= '0' && c <= '9'; c = getchar())
x = x * 10 + c - '0';
return p ? -x : x;
}
inline void re_l()
{
char c = getchar();
for (; c < 'a' || c > 'z'; c = getchar());
for (; c >= 'a' && c <= 'z'; c = getchar())
{
if (!mp[c])
{
a[++l].c = c;
a[l].s = 1;
mp[c] = l;
}
else
a[mp[c]].s++;
}
}
int main()
{
int i, k = 0, j;
re();
re_l();
for (i = 1; i <= l; i++)
for (j = 1; j <= a[i].s; j++)
an[++k] = a[i].c;
for (i = 1; i <= k; i++)
putchar(an[i]);
return 0;
}
D. Labyrinth
Description
一个迷宫,部分格子有障碍物不能走,而你向左和向右走的步数有限制,向上和向下则没有限制,求你一共能到达多少个格子。
Solution
为了到达某个格子是最优情况(剩余向左向右的步数尽量多),可以使用双端队列\(+BFS\),将向上或下走的插入队首,向左或向右的插入队尾,正常\(BFS\)即可。
因为我和机房大佬们一开始想复杂了,我打了\(3.4k\),结果我打挂了。。最后\(1\)分钟的时候,就想着交个暴力算了,于是爆改代码到\(1.6k\),离结束\(15s\)的时候\(pp\)了。
结果因为我恰好改的就是双端队列\(+BFS\)(一开始想的也是基于这个)暴力搜,结果\(A\)了。。。
因为临时爆改,代码很冗长,\(BFS\)里的两个\(if\)和一个\(for\)其实可以合在一起,凑合着看吧。
#include<cstdio>
#include<deque>
using namespace std;
const int N = 2010;
struct dd{
int x, y, mx, my;
};
dd X, Y;
int a[N][N], b[N][N], mo_x[2] = {1, -1}, mo_y[2] = {0, 0}, n, m, s;
deque<dd>q;
inline int re()
{
int x = 0;
char c = getchar();
bool p = 0;
for (; c < '0' || c > '9'; c = getchar())
p |= c == '-';
for (; c >= '0' && c <= '9'; c = getchar())
x = x * 10 + c - '0';
return p ? -x : x;
}
inline void re_l(int i)
{
int k = 0;
char c = getchar();
for (; c != '.' && c != '*'; c = getchar());
for (; c == '.' || c == '*'; c = getchar())
{
a[i][++k] = c == '*' ? -1 : 0;
b[i][k] = a[i][k];
}
}
int main()
{
int i, j, s = 0;
n = re();
m = re();
X.x = re();
X.y = re();
X.mx = re();
X.my = re();
for (i = 1; i <= n; i++)
re_l(i);
a[X.x][X.y] = 1;
q.push_back(X);
while (!q.empty())
{
X = q.front();
q.pop_front();
Y = X;
for (i = 0; i < 2; i++)
{
Y.x = X.x + mo_x[i];
if (!a[Y.x][Y.y] && Y.x > 0 && Y.x <= n && Y.y > 0 && Y.y <= m)
{
a[Y.x][Y.y] = 1;
q.push_front(Y);
}
}
if (X.mx > 0)
{
Y = X;
Y.y--;
Y.mx--;
if (!a[Y.x][Y.y] && Y.x > 0 && Y.x <= n && Y.y > 0 && Y.y <= m)
{
a[Y.x][Y.y] = 1;
q.push_back(Y);
}
}
if (X.my > 0)
{
Y = X;
Y.y++;
Y.my--;
if (!a[Y.x][Y.y] && Y.x > 0 && Y.x <= n && Y.y > 0 && Y.y <= m)
{
a[Y.x][Y.y] = 1;
q.push_back(Y);
}
}
}
for (i = 1; i <= n; i++)
for (j = 1; j <= m; j++)
if (a[i][j] > 0)
s++;
printf("%d", s);
return 0;
}
CF Round #516 (Div. 2, by Moscow Team Olympiad)的更多相关文章
- Codeforces Round #516 (Div. 2, by Moscow Team Olympiad)
题目链接 A. Make a triangle! 题意 让某段最少增加多少使得构成三角形 思路 让较小两段往最长段去凑 代码 #include <bits/stdc++.h> #defin ...
- Codeforces Round #516 (Div. 2, by Moscow Team Olympiad) D. Labyrinth
http://codeforces.com/contest/1064/problem/D 向上/向下加0,向左/右加1, step = 0,1,…… 求的是最少的步数,所以使用bfs. step=k ...
- Codeforces Round #516 (Div. 2, by Moscow Team Olympiad) D. Labyrinth(重识搜索)
https://codeforces.com/contest/1064/problem/D 题意 给你一个有障碍的图,限制你向左向右走的次数,问你可以到达格子的个数 思路 可以定义状态为vi[x][y ...
- [Codeforces Round #516 (Div. 2, by Moscow Team Olympiad) ](A~E)
A: 题目大意:给你$a,b,c$三条边,可以给任意的边加任意的长度,求最少共加多少长度使得可以构成三角形 题解:排个序,若可以组成,输出$0$,否则输出$c-a-b+1(设a\leqslant b\ ...
- Codeforces Round #441 (Div. 2, by Moscow Team Olympiad) D. Sorting the Coins
http://codeforces.com/contest/876/problem/D 题意: 最开始有一串全部由"O"组成的字符串,现在给出n个数字,指的是每次把位置n上的&qu ...
- Codeforces Round #441 (Div. 2, by Moscow Team Olympiad) C. Classroom Watch
http://codeforces.com/contest/876/problem/C 题意: 现在有一个数n,它是由一个数x加上x每一位的数字得到的,现在给出n,要求找出符合条件的每一个x. 思路: ...
- Codeforces Round #441 (Div. 2, by Moscow Team Olympiad) B. Divisiblity of Differences
http://codeforces.com/contest/876/problem/B 题意: 给出n个数,要求从里面选出k个数使得这k个数中任意两个的差能够被m整除,若不能则输出no. 思路: 差能 ...
- Codeforces Round #441 (Div. 2, by Moscow Team Olympiad) A. Trip For Meal
http://codeforces.com/contest/876/problem/A 题意: 一个人一天要吃n次蜂蜜,他有3个朋友,他第一次总是在一个固定的朋友家吃蜂蜜,如果说没有吃到n次,那么他就 ...
- Codeforces Round #441 (Div. 2, by Moscow Team Olympiad)
A. Trip For Meal 题目链接:http://codeforces.com/contest/876/problem/A 题目意思:现在三个点1,2,3,1-2的路程是a,1-3的路程是b, ...
随机推荐
- APP支付-》支付宝RSA2->支付与验签
第一次配置支付宝,按照官网示例搞了一天,走不通.经过两天的踩坑,百度了大神的代码,支付宝终于可以了. 1:下载这是官网的最新SDK 2:配置SDK,添加命名空间 AopClient.php文件: Si ...
- linux下安装Cmake和Sniffles
-------------------------------------------------------------------cmake的安装------------------------- ...
- BOM进IN_BOM_HEADER表后被过滤掉
1.查看如下两个表发现BOM被过滤掉了 SELECT PRODUCT_ID||'_'||substr(BOM_ID,1,8),A.* FROM IN_BOM_HEADER A WHERE A.PRO ...
- Jmeter使用HTTP代理服务器进行录制
1.添加一个线程组 2.在工作台右键添加HTTP代理服务器 3.配置代理服务器 *注:端口号不能被占用.排除模式中添加的东西将在录制时不被录制上. 端口可能会有被占用的情况,这种情况下点击启动会报错, ...
- selenium ide界面介绍
Selenium Ide是firefox浏览器的一个插件,可以进行web的录制和回放,完成简单的自动化测试,同时可以将录制的脚本导出多种语言的脚本. 下面是Selenium Ide的界面: Base ...
- ORM笔记
ORM工具的唯一作用就是:把对持久化对象的保存.删除.修改等操作,转换成对数据库的操作,而ORM框架则负责转换成对应的SQL(结构化查询语言)操作.(ORM工具可完成对象模型和关系模型直接的相互映射) ...
- PERL 正则表达式简介
来源:脚本之家 网址:http://www.jb51.net/article/17429.htm 一.简介 二.匹配操作符 三.模式中的特殊字符 1.字符+ 2.字符 []和[^] 3.字符 *和? ...
- LeetCode第20题
LeetCode20题不多说上代码 public boolean isValid(String s){ Stack<Character> stack = new Stack<Char ...
- Python+Selenium学习--键盘事件
场景 我们在实际的测试工作中,有时候需要使用tab键将焦点移动到下一个元素,用于验证元素的排序是否正确.webdriver的Keys()类提供键盘上所有的操作,甚至可以模拟一些组合键的操作,如Ctrl ...
- JMeter快速入门之Badboy录制
1. 前言 JMeter录制有两种方式,一种是JMeter自带录制方法,另一种是下面要学习的Badboy录制,个人推荐使用此方法 下面教程不设计Badboy安装,可以百度一下. 2. 录制步骤: 2. ...