[Codeforces Round #513 by Barcelona Bootcamp (rated, Div. 1 + Div. 2) ](A~E)
A:
题目大意:给你一个数字串,每个数字只可以用一次,求最多可以组成多少个电话号码(可以相同),电话号码第一个数字为$8$,且长度为$11$
题解:限制为$8$的个数和总长度,直接求
卡点:无
C++ Code:
#include <cstdio>
#include <algorithm>
#define maxn 1000
inline int min(int a, int b) {return a < b ? a : b;}
inline int max(int a, int b) {return a > b ? a : b;}
int Tim, n, _8;
char s[maxn];
int main() {
scanf("%d", &n);
scanf("%s", s + 1);
for (int i = 1; i <= n; i++) if (s[i] == '8') _8++;
printf("%d\n", min(_8, n / 11));
return 0;
}
B:
题目大意:给你一个数$x$,求两个数$a,b$,使得$a+b=n$,且价值和最大,$a$的价值定义为它各个数位上的数字和
题解:$a$尽可能多分$9$,$b$为$x-a$
卡点:无
C++ Code:
#include <cstdio>
#include <algorithm>
inline int min(int a, int b) {return a < b ? a : b;}
inline int max(int a, int b) {return a > b ? a : b;}
long long n, a, b, len;
long long ans;
inline int count(long long a) {
int ans = 0;
while (a) {
ans += a % 10;
a /= 10;
}
return ans;
}
int main() {
scanf("%I64d", &n);
long long nn = n;
while (nn) {
len++;
nn /= 10;
}
ans = (len - 1) * 9;
for (int i = 1; i < len; i++) a = a * 10 + 9;
ans += count(n - a);
printf("%I64d\n", ans);
return 0;
}
C:
题目大意:给定$a_1,a_2,\dots,a_n$和$b_1,b_2,\dots,b_m$。$c_{i,j}=a_ib_j$。
给定$x$,求四个数$x_1,y_1,x_2,y_2$满足:
$\sum_{i=x_1}^{x_2}\sum_{j=y_1}^{y_2}c_{i,j}\leqslant x$。
对于每个满足条件的四元组$(x_1,y_1,x_2,y_2)$,定义其价值为$(x_2-x_1+1)\times(y_2-y_1+1)$,求最大价值。
题解:
$$
\sum_{i=x_1}^{x_2}\sum_{j=y_1}^{y2}c_{i,j}=\sum_{i=x_1}^{x_2}\sum_{j=y_1}^{y2}a_ib_j=(\sum_{i=x_1}^{x_2}a_i)(\sum_{j=y_1}^{y_2}b_j)
$$
记录下每个$x_2-x_1+1$对应最小的$\sum_{i=x_1}^{x_2}a_i$,每个$y_2-y_1+1$对应最小的$\sum_{j=y_1}^{y_2}b_j$,枚举,找最大的即可。
卡点:无
C++ Code:
#include <cstdio>
#include <algorithm>
#define maxn 2010
const long long inf = 0x3f3f3f3f3f3f3f3f;
inline long long min(long long a, long long b) {return a < b ? a : b;}
inline long long max(long long a, long long b) {return a > b ? a : b;}
int a[maxn], b[maxn];
long long sa[maxn], sb[maxn], ans, x;
long long A[maxn], B[maxn];
int n, m;
int main() {
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; i++) scanf("%d", a + i), sa[i] = sa[i - 1] + a[i];
for (int i = 1; i <= m; i++) scanf("%d", b + i), sb[i] = sb[i - 1] + b[i];
scanf("%I64d", &x);
for (int i = 1; i <= n; i++) {
A[i] = inf;
for (int j = 1; j <= n - i + 1; j++) {
A[i] = min(sa[i + j - 1] - sa[j - 1], A[i]);
}
// printf("A[%d] : %lld\n", i, A[i]);
}
for (int i = 1; i <= m; i++) {
B[i] = inf;
for (int j = 1; j <= m - i + 1; j++) {
B[i] = min(sb[i + j - 1] - sb[j - 1], B[i]);
}
// printf("A[%d] : %lld\n", i, B[i]);
}
ans = 0;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
if (A[i] * B[j] <= x) ans = max(ans, i * j);
}
}
printf("%I64d\n", ans);
return 0;
}
D:
题目大意:有$n$个人,坐成若干圈(每人面对圈中间)。第$i$个人左边要有$l_i$个空位,右边要有$r_i$个空位。问至少要多少个座位。
题解:考虑把$l_i$和$r_i$分别看成一个点,则原题变为一张二分图。要求找到一个匹配,每条边的价值为$\max(l_x,r_y)+1$,使得价值最小。
也就是要求“浪费”最少,即按$l$和$r$分别排序,最小连最小,次小连次小……
卡点:前两次没猜中结论。。。
C++ Code:
#include <cstdio>
#include <algorithm>
#define maxn 100010
inline int min(int a, int b) {return a < b ? a : b;}
inline int max(int a, int b) {return a > b ? a : b;}
int n;
long long l[maxn], r[maxn], ans, tmpl, tmpr;
int rnkl[maxn], rnkr[maxn], totl, totr;
bool vl[maxn], vr[maxn];
inline bool cmpl(int a, int b) {return l[a] < l[b];}
inline bool cmpr(int a, int b) {return r[a] < r[b];}
long long sum;
int main() {
scanf("%d", &n);
for (int i = 1; i <= n; i++) scanf("%I64d%I64d", l + i, r + i);
std::sort(l + 1, l + n + 1);
std::sort(r + 1, r + n + 1);
for (int i = 1; i <= n; i++) ans += max(l[i], r[i]);
printf("%I64d\n", ans + n);
return 0;
}
E:
题目大意:一棵树。可以在任意两个在原树中距离为$2$的点之间连一条边。求所有点对间最短路的和。
题解:
$$
\begin{align*}
ans&=\sum\limits_{i=1}^{n-1}\sum\limits_{j=i+1}^n\left\lceil\dfrac{dis_{i,j}}{2}\right\rceil\\
&=\dfrac{\sum\limits_{i=1}^{n-1}\sum\limits_{j=i+1}^ndis_{i,j}+奇数的路径数目}{2}\\
\end{align*}\\
$$
易证,求出来的一定是整数
卡点:没开$long\;long$,被$FST$了
C++ Code:
#include <cstdio>
#include <algorithm>
#define maxn 200010
inline int min(int a, int b) {return a < b ? a : b;}
inline int max(int a, int b) {return a > b ? a : b;}
int n;
int head[maxn], cnt = 1;
struct Edge {
int to, nxt;
} e[maxn << 1];
inline void add(int a, int b) {
e[++cnt] = (Edge) {b, head[a]}; head[a] = cnt;
// e[++cnt] = (Edge) {a, head[b]}; head[b] = cnt;
}
long long ans, ansji;
int fa[maxn];
long long uji[maxn], uou[maxn], dji[maxn], dou[maxn], sz[maxn];
void dfs1(int u) {
sz[u] = 1;
dou[u] = 1;
for (int i = head[u]; i; i = e[i].nxt) {
int v = e[i].to;
if (v != fa[u]) {
fa[v] = u;
dfs1(v);
ans += 1ll * sz[v] * (n - sz[v]);
sz[u] += sz[v];
ansji += dji[v] * dji[u] + dou[u] * dou[v];
dou[u] += dji[v];
dji[u] += dou[v];
}
}
}
int main() {
scanf("%d", &n);
for (int i = 1, a, b; i < n; i++) {
scanf("%d%d", &a, &b);
add(a, b);
add(b, a);
}
dfs1(1);
printf("%I64d\n", (ans + ansji >> 1ll));
return 0;
}
[Codeforces Round #513 by Barcelona Bootcamp (rated, Div. 1 + Div. 2) ](A~E)的更多相关文章
- Codeforces Round #513 by Barcelona Bootcamp (rated, Div. 1 + Div. 2) C D
C - Maximum Subrectangle 因为是两个数组相乘的到的 矩阵所以 a(i ->j)*b(x->y) 的面积 就是 a(i ->j) 的和乘与b(x-> ...
- Codeforces Round #513 by Barcelona Bootcamp C. Maximum Subrectangle(双指针+思维)
https://codeforces.com/contest/1060/problem/C 题意 给两个数组,a数组有n个元素,b数组有m个元素,两个数组元素互相相乘形成n*m的矩阵,找一个子矩阵,元 ...
- Codeforces Round #513 by Barcelona Bootcamp
A. Phone Numbers 签. #include <bits/stdc++.h> using namespace std; #define N 110 char s[N]; ], ...
- Codeforces Round #513 游记
Codeforces Round #513 游记 A - Phone Numbers 题目大意: 电话号码是8开头的\(1\)位数字.告诉你\(n(n\le100)\)个数字,每个数字至多使用一次.问 ...
- Codeforces Round #412 A Is it rated ?
A. Is it rated? time limit per test 2 seconds memory limit per test 256 megabytes Is it rated? Her ...
- Codeforces Round #513 (rated, Div. 1 + Div. 2)
前记 眼看他起高楼:眼看他宴宾客:眼看他楼坍了. 比赛历程 开考前一分钟还在慌里慌张地订正上午考试题目. “诶这个数位dp哪里见了鬼了???”瞥了眼时间,无奈而迅速地关去所有其他窗口,临时打了一个缺省 ...
- Codeforces Round 513 (Div.1+Div.2)
比赛传送门 10月4号的比赛,因为各种原因(主要是懒),今天才写总结-- Div1+Div2,只做出两个题+迟到\(20min\),日常掉\(rating\)-- \(\rm{A.Phone\;Num ...
- Codeforces Round #513 总结
首次正式的$Codeforces$比赛啊,虽然滚粗了,然而终于有$rating$了…… #A Phone Numbers 签到题,然而我第一次写挂了(因为把11看成8了……) 只需要判断一下有多少个 ...
- Codeforces Round #513解题报告(A~E)By cellur925
我是比赛地址 A:Phone Numbers $Description$:给你一串数字,问你能组成多少开头为8的11位电话号码. $Sol$:统计8的数量,与$n$%11作比较. #include&l ...
随机推荐
- Nodejs 调试方法
nodejs内部提供一个debug机制,可以让程序进入debug模式,供开发者一步一步分析代码发现问题. 共有3中启动参数可以让程序进入debug模式,假设我们要对app.js进行调试. node d ...
- 【PE】手动给PE文件添加一段代码MessageBoxA
源程序是这个样子: 思路: 1.通过LordPE工具拿到所需数据 2.OllyDebug通过BP MessageBoxA拿到MessageBoxA地址 3.UE十六进制编辑器定位代码节基址 4.在代码 ...
- WIN10使用安装包安装Mysql5.6+JDBC
很多教程教的是安装绿色版mysql或者是安装zip版的mysql,没什么不好,各有千秋,今天要教大家的是使用mysql-installer-community-5.6.43.0.msi安装mysql5 ...
- rsync同步备份搭建
Rsync 是 Unix/Linux 下的一款应用软 在平常的运维中进常要对一些数据进行备份,以防止意外的服务器故障导致不可避免的后果,tar,cp只能适应一些小范围backup,对于几T甚至几P的数 ...
- python__系统 : 线程
线程之间,全局变量可以共享,但是局部变量依然是不共享的,线程的创建方式: threading.Thread(),还可以定义一个类继承Thread,重写他的run方法,具体和进程的写法一样. 那么,线程 ...
- PyQuery网页解析库
from pyquery import PyQuery as pq 字符串初始化: doc = pq(html) URL初始化:doc = pq(url = "···") 文件初始 ...
- 部分和问题 南阳acm1058(递归+dfs)
部分和问题 时间限制:1000 ms | 内存限制:65535 KB 难度:2 描述 给定整数a1.a2........an,判断是否可以从中选出若干数,使它们的和恰好为K. 输入 首先, ...
- MySQL忘记密码怎么重置
1打开mysql.exe和mysqld.exe所在的文件夹,复制路径地址 输入命令 mysqld --skip-grant-tables 回车,此时就跳过了mysql的用户验证.注意输入此命令之后 ...
- 一行代码将两个列表拼接出第三个列表(两个可迭代对象相加产生第三个可迭代对象)--map()方法
map()方法 map(func, *iterables) --> map object lambda方法: lambda 参数 :返回值 a = map(',7]) print(list(a ...
- Linux下添加桌面快捷方式
这里用Ubuntu下BurpSuite举例 sudo vim /home/user/Desktop/burpsuite.desktop //burpsuite随意起名,系统会系动创建文件 文件写入 # ...