比赛链接:传送门

A. Make a triangle!(简单思维)

题目大意:

给你三条边,问你最多加多少长度能使这三条边能构成三角形。

思路:

最大边小于答案加另外两条边的和。

#include <bits/stdc++.h>

using namespace std;

int main()
{
int a, b, c;
cin >> a >> b >> c;
int _max = max(a, b);
_max = max(_max, c);
int sum = a+b+c - _max;
int ans = max(, _max-sum+);
cout << ans << endl;
return ;
}

B. Equations of Mathematical Magic(位运算)

题目大意:

给定a,求方程:a = x + (a^x)的非负整数解的数量。(符号"^"表示异或)

思路:

只有一个二进制位时:(表达式各位置的对应未知数与上面方程对齐)

① a = 0:0 = 0 + (0^0)

② a = 1:1 = 0 + (1^0) = 1 + (1^1)

所以对于题目a的每个二进制位:

① 如果为0,则x的对应二进制位也只能为0

② 如果为1,则x的对应二进制位可以是1或0

组合后答案为2k,(其中k为a变成二进制后1的个数)

#include <bits/stdc++.h>

using namespace std;

int main()
{
int T;
cin >> T;
while (T--) {
int N;
cin >> N;
int cnt = ;
while (N) {
if (N&)
cnt++;
N/=;
}
cout << ( << cnt) << endl;
}
return ;
}
/*
3
0
2
1073741823
*/

C. Oh Those Palindromes(字符串)

题目大意:

求给定字符串重排序后,最多的回文子串数量。

思路:

把一样的字母放在一起貌似就可以了。(直接sort)

#include <bits/stdc++.h>

using namespace std;

int cnt[];

int main()
{
int N;
string s;
cin >> N >> s;
memset(cnt, , sizeof cnt);
for (int i = ; i < N; i++) {
int ind = s[i] - 'a';
cnt[ind]++;
}
for (int i = ; i < ; i++) {
while (cnt[i]--) {
printf("%c", 'a'+i);
}
}
printf("\n");
return ;
}

D. Labyrinth(0-1bfs)

题目大意:

给定bfs图,起始点,最多的左移次数X、右移次数Y,求能访问的最多的格子数。

思路:

用bfs乍一搜可以pretest passed,但是可以被这组样例hack。

/*
20 7
3 6
5 2
......*
.****.*
.****.*
....*.*
**.**.*
**.**.*
**.**.*
**.**.*
**.**.*
**.**.*
**.**.*
**.**.*
**.**.*
**.**.*
**.**.*
**.**.*
**.**.*
**.**.*
**....*
*******
*/

加一个对当前点X、Y的最大值的维护即可。

另外可以按列缩点跑最短路,不过我没试过。

#include <bits/stdc++.h>

using namespace std;
const int MAX_N = 2e3 + ;
const int actx[] = {, , , -};
const int acty[] = {, -, , }; struct Node{
int x, y;
int resl, resr;
Node(int xx = , int yy = , int ll = , int rr = ) : x(xx), y(yy), resl(ll), resr(rr) {}
}nodes[MAX_N][MAX_N]; int N, M, R, C, X, Y;
char mat[MAX_N][MAX_N];
bool vis[MAX_N][MAX_N]; inline bool check(int x, int y)
{
if (x < || x > N || y < || y > M)
return false;
if (mat[x][y] == '*')
return false;
return true;
} int main()
{
cin >> N >> M >> R >> C >> X >> Y;
memset(vis, false, sizeof vis);
for (int i = ; i <= N; i++)
scanf("%s", mat[i]+); queue <Node> Q;
vis[R][C] = true;
Q.push(Node(R, C, X, Y));
while (!Q.empty()) {
Node cur = Q.front(); Q.pop();
for (int i = ; i < ; i++) {
int x = cur.x + actx[i];
int y = cur.y + acty[i];
if (!check(x, y))
continue;
int l = cur.resl;
int r = cur.resr;
if (i == )
r--;
if (i == )
l--;
if (l < || r < )
continue;
if (x == && y == )
int aaa = ;
if (vis[x][y]) {
if (l > nodes[x][y].resl || r > nodes[x][y].resr) {
nodes[x][y].resl = max(l, nodes[x][y].resl);
nodes[x][y].resr = max(r, nodes[x][y].resr);
}
else
continue;
}
else if (!vis[x][y]) {
nodes[x][y] = Node(x, y, l, r);
vis[x][y] = true;
}
Q.push(Node(x, y, l, r));
}
}
int ans = ;
for (int i = ; i <= N; i++) {
for (int j = ; j <= M; j++) {
if (vis[i][j])
ans++;
}
}
cout << ans << endl;
return ;
}

更新:

正解应该是0-1bfs(说白了就是用双向队列deque维护的bfs)

纵向搜到的点入队首,横向搜到的点入队尾。

#include <bits/stdc++.h>

using namespace std;
const int MAX_N = + ;
const int actx[] = {, -, , };
const int acty[] = {, , , -};
#define nx cur.x+actx[i]
#define ny cur.y+acty[i] struct Node{
int x, y;
int l, r;
Node (int xx = , int yy = , int ll = , int rr = ) : x(xx), y(yy), l(ll), r(rr) {}
}; int N, M, R, C, X, Y;
bool vis[MAX_N][MAX_N];
char mat[MAX_N][MAX_N]; bool check(int x, int y)
{
if (x < || x > N || y < || y > M)
return false;
if (mat[x][y] == '*' || vis[x][y])
return false;
return true;
} int bfs0_1()
{
int ans = ;
memset(vis, false, sizeof vis);
deque <Node> Q;
Q.push_back(Node(R, C, X, Y));
vis[R][C] = true;
while (!Q.empty()) {
Node cur = Q.front(); Q.pop_front();
for (int i = ; i < ; i++) {
if (!check(nx, ny))
continue;
int l = cur.l;
int r = cur.r;
if (i < ) {
Q.push_front(Node(nx, ny, l, r));
}
else {
if (i == )
r--;
if (i == )
l--;
if (l < || r < )
continue;
Q.push_back(Node(nx, ny, l, r));
}
vis[nx][ny] = true;
ans++;
}
}
return ans;
} int main()
{
cin >> N >> M >> R >> C >> X >> Y;
for (int i = ; i <= N; i++)
scanf("%s", mat[i]+);
cout << bfs0_1() << endl; return ;
}

E. Dwarves, Hats and Extrasensory Abilities(二分)

题目大意:

交互式的题目,给定N,然后你输出N个点的坐标,你每输出一个点,他给你这个点的颜色(随机黑或白),然后让你给出一条直线,使得黑白的点在线的两边。

思路:

二分坐标系。注意题目中坐标系的上限直接拿来用的话,不够N的最大值。

所以有下图的二分选择:

注意交互式的题目输出时要加一个cout << flush;

#include <iostream>

using namespace std;

int main()
{
int N;
cin >> N;
int l = , r = << ;
string sl, scur;
cout << l << ' ' << l << endl << flush;
cin >> sl;
if (N == ) {
cout << << ' ' << << endl << flush;
cout << << ' ' << << endl << flush;
return ;
}
cout << r << ' ' << << endl << flush;
cin >> scur;
N -= ;
if (sl == scur) {//在(2^29, 0)到(2^29, 2^29)内二分
int mid = (l + r) >> ;
int x = << ;
while (N--) {
cout << x << ' ' << mid << endl << flush;
cin >> scur;
if (scur == sl)
l = mid;
else
r = mid;
mid = (l + r) >> ;
}
cout << x << ' ' << mid << endl << flush;
cout << x- << ' ' << mid << endl << flush;
}
else {
int mid = (l+r) >> ;
int y = ;
while (N--) {
cout << mid << ' ' << y << endl << flush;
cin >> scur;
if (sl == scur) {
l = mid;
}
else {
r = mid;
}
mid = (l+r) >> ;
}
cout << mid << ' ' << y << endl << flush;
cout << mid << ' ' << y+ << endl << flush;
}
return ;
}

更新:

在x轴上二分也可以。

#include <iostream>

using namespace std;

void print(int x, int y)
{
cout << x << ' ' << y << endl << flush;
} int main()
{
int N;
string col, pre;
cin >> N;
int l = , mid = , r = <<;
if (N--) {
print(l, );
cin >> pre;
mid = (l+r) >> ;
}
while (N--) {
print(mid, );
cin >> col;
if (col == pre)
l = mid;
else
r = mid;
mid = (l+r) >> ;
}
print(l, );
print(r, );
return ;
}

F. Candies for Children(数学+分类暴力)

题目大意:

有n个人围成一圈分k个糖果,从 l 开始分到 r ,可以跑很多圈。一个人拿一颗,里面有p个人喜欢甜食会拿两颗。

问你p的最大值。数据矛盾则输出-1。

思路:

题目中的数据范围是1e11,这个数据很微妙(1e11 = 1e5 * 1e6),所以分两种情况讨论:

① n < 2e6 :

   这时候可以直接跑答案。

  对于给定的p,y有很多取值,但是可以直接取模算出y的满足p、d约束最大值。O(n)复杂度。

② n > 2e6 :

   这时候跑圈数i,每个对应的圈数可以求出最大的喜欢甜食的人数:

  1、(p + n) * i + y + d = k

  2、p - y <= n - d

  联立这个就可以求p的最大值。(其中d表示l跑到r的人数,y表示d中的喜甜人数)然后处理一下细节就可以O(k/n)。

  然后暴力跑就好了。注意一个点就是最后一个人可以喜欢甜食但是只拿一个。

#include <bits/stdc++.h>

using namespace std;
typedef long long ll;
const ll X = 2e6 + ; int main()
{
ll n, l, r, k;
cin >> n >> l >> r >> k;
ll d = (r - l + n) % n + ; ll ans = -;
if (n < X) {
for (ll p = n; p >= ; p--) {
ll y = (k - )%(n + p) + - d;
if (y < || y > p || y > d || d-(y+) > n-p)
continue;
ll y2 = y+;
if (y2 <= p && y2 <= d) {
ans = max(ans , p);
}
if (d-y <= n-p) {
ans = max(ans, p);
}
}
}
else {
for (ll i = ; i <= k/n; i++) {
ll p = (k - *d - (i-)*n + ) / (i+);
ll y = k - i*(n+p) - d;
if (y < ) {
if (i == )
continue;
ll dis = (-y - ) / i + ;
y += i*dis;
p -= dis;
}
if (p > n) {
y += (p-n) * i;
p == n;
}
if (y < || y > p || y > d || d-(y+) > n-p)
continue;
ll y2 = y+;
if (y2 <= p && y2 <= d) {
ans = max(ans , p);
}
if (d-y <= n-p) {
ans = max(ans, p);
}
}
}
cout << ans << endl;
return ;
}
/*
10 5 5 1
10000000 5 5 1
*/

Codeforces Round #516(Div 2)的更多相关文章

  1. Codeforces Round #516 (Div. 2)D. Labyrinth(BFS)

    题目链接:http://codeforces.com/contest/1064/problem/D 题目大意:给你一个n*m的图,图中包含两种符号,'.'表示可以行走,'*'表示障碍物不能行走,规定最 ...

  2. 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 ...

  3. Codeforces Round #516 (Div. 2) (A~E)

    目录 Codeforces 1064 A.Make a triangle! B.Equations of Mathematical Magic C.Oh Those Palindromes D.Lab ...

  4. Codeforces Round #516 (Div. 2, by Moscow Team Olympiad) D. Labyrinth(重识搜索)

    https://codeforces.com/contest/1064/problem/D 题意 给你一个有障碍的图,限制你向左向右走的次数,问你可以到达格子的个数 思路 可以定义状态为vi[x][y ...

  5. Codeforces Round #516 (Div. 2)D. Labyrinth

    D. Labyrinth 题目链接:https://codeforces.com/contest/1064/problem/D 题意: 给出一个n*m的矩阵以及人物的起点,并且给出x,y,分别代表这个 ...

  6. Codeforces Round #516 (Div. 2, by Moscow Team Olympiad)

    题目链接 A. Make a triangle! 题意 让某段最少增加多少使得构成三角形 思路 让较小两段往最长段去凑 代码 #include <bits/stdc++.h> #defin ...

  7. Codeforces Round#516 Div.1 翻车记

    A:开场懵逼.然后发现有人1min过,于是就sort了一下,于是就过了.正经证明的话,考虑回文串两端点一定是相同的,所以最多有Σcnti*(cnti+1)/2个,cnti为第i种字母出现次数.而sor ...

  8. [Codeforces Round #516 (Div. 2, by Moscow Team Olympiad) ](A~E)

    A: 题目大意:给你$a,b,c$三条边,可以给任意的边加任意的长度,求最少共加多少长度使得可以构成三角形 题解:排个序,若可以组成,输出$0$,否则输出$c-a-b+1(设a\leqslant b\ ...

  9. Codeforces Round #366 (Div. 2) ABC

    Codeforces Round #366 (Div. 2) A I hate that I love that I hate it水题 #I hate that I love that I hate ...

随机推荐

  1. 在springboot中验证表单信息(六)

    构建工程 创建一个springboot工程,由于用到了 web .thymeleaf.validator.el,引入相应的起步依赖和依赖,代码清单如下: 1 2 3 4 5 6 7 8 9 10 11 ...

  2. startActivityForResult的用法,以及intent传递图片

    开启startActivityForResult. Intent intent = new Intent(); intent.setClass(MainActivity.this, MipcaActi ...

  3. Oracle 如何循环查询结果集,进行新增或修改

    Oracle的PL/SQL中怎样循环查询的结果集,然后根据查询结果进行判断,是新增或修改操作 loop循环例子 for item in (select a,b,c from table_a where ...

  4. WPF实现DoEvents

    WPF实现DoEvents 原创 2011年06月30日 12:23:00 标签: wpf / object 2550 static void DoEvents() { DispatcherFrame ...

  5. spoj220

    题解: 后缀数组 把所有串连接起来 二分答案 代码: #include<cstdio> #include<cstring> #include<algorithm> ...

  6. js onclick函数中传字符串参数的问题

    规则: 外变是“”,里面就是‘’外边是‘’,里边就是“”   示例: var a="111"; var html="<a onclick='selecthoods( ...

  7. find 命令实战巧用

    一.命令简介 find 命令的 -size 参数 单位b(不是byte而是block).c.w.k.M.G.默认是单位b ,也就是1block = 512byte = 0.5kb (文件系统ext4) ...

  8. 读书笔记 enum枚举之位标志属性(Flags)浅析

    针对enum枚举来说,可以定义位标志属性,从而使该枚举类型的实例可以存储枚举列表中定义值的任意组合.可以用 与(&).或(|).异或(^)进行相应的运算.废话不多说,代码最直接. //每一个定 ...

  9. Vue基础以及指令

    Vue 基础篇一   一.Vue框架介绍 之前大家学过HTML,CSS,JS,JQuery,Bootstrap,现在我们要学一个新的框架Vue~ Vue是一个构建数据驱动的web界面的渐进式框架. 目 ...

  10. 第二章 使用unittest模块扩展功能测试

    2.1使用功能测试驱动开放一个最简单的应用 # functional_tests.py # -*- coding: utf-8 -*- from selenium import webdriver b ...