Codeforces_Round_547 (Div. 3)题解
题目链接
A题
题目
题意
给你两个正整数\(n\)和\(m\),然后你可以进行无数次操作(每次操作可以将\(n\)扩大两倍,或者扩大三倍),问你是否能够得到\(m\)。
代码实现如下
n, m = map(int, input().split())
if m % n == 0:
num = 0
m //= n
while(m % 2 == 0):
m //= 2
num = num + 1
while(m % 3 == 0):
m //= 3
num = num + 1
if(m == 1):
print(num)
else:
print(-1)
else:
print(-1)
B题
题目
题意
给你一个长度为\(n\)的\(01\)串进行无限循环,问你连续最长的\(1\)有多长。
思路
将这个\(01\)串复制一次,然后找连续最长的\(1\)就行。
代码实现如下
n = eval(input())
a = list(map(int, input().split()))
a.extend(a)
cnt = 0
l = -1
for i in range(2*n):
if(a[i] == 1):
if(l == -1):
l = i
cnt = max(cnt, 1)
else:
cnt = max(cnt, i - l + 1)
else:
l = -1
print(cnt)
C题
题目
题意
有一个长为\(1~n\)的排列\(a_i\),现在给你相邻两项的差\(p_i\),要你重新构造这个排列。
思路
我们通过计算可以发现\(a_2=a_1+p_1,a_3=a_1+p_1+p_2,a_n=a_1+p_1+p_2+...+p_{n-1}\),然后我们知道\(\sum_{i=1}^{k}p_i\)最大对应的那个\(a_i\)一定是\(n\),因此我们一减就可以得到\(a_1\),然后剩下的也都可以通过前面说的那些等式构造出来~
代码实现如下
n = eval(input())
a = list(map(int,input().split()))
p = [0]
for i in range(0,n-1):
p.append(p[-1]+a[i])
mx = max(p)
ans = []
ans.append(n-mx)
for i in range(1,n):
ans.append(ans[0]+p[i])
if set(range(1,n+1))==set(ans):
print(*ans)
else:
print(-1)
D题
题目
题意
给你两个字符串\(s\)和\(t\),问这两个字符串的最大匹配度是多少。
匹配规则为:
1.相同字母进行匹配;
2.字符和'?'进行匹配。
代码实现如下
#include <set>
#include <map>
#include <deque>
#include <queue>
#include <stack>
#include <cmath>
#include <ctime>
#include <bitset>
#include <cstdio>
#include <string>
#include <vector>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef pair<LL, LL> pLL;
typedef pair<LL, int> pLi;
typedef pair<int, LL> piL;;
typedef pair<int, int> pii;
typedef unsigned long long uLL;
#define lson rt<<1
#define rson rt<<1|1
#define lowbit(x) x&(-x)
#define name2str(name) (#name)
#define bug printf("*********\n")
#define debug(x) cout<<#x"=["<<x<<"]" <<endl
#define FIN freopen("in","r",stdin)
#define IO ios::sync_with_stdio(false),cin.tie(0)
const double eps = 1e-8;
const int mod = 1e9 + 7;
const int maxn = 150000 + 7;
const double pi = acos(-1);
const int inf = 0x3f3f3f3f;
const LL INF = 0x3f3f3f3f3f3f3f3fLL;
int n;
char s[maxn], t[maxn];
vector<int> l[30], r[30], lp, rp;
vector<pii> ans;
int main() {
#ifndef ONLINE_JUDGE
FIN;
#endif
scanf("%d", &n);
scanf("%s%s", s, t);
for(int i = 0; i < n; ++i) {
if(s[i] == '?') {
lp.push_back(i+1);
} else {
int x = s[i] - 'a';
l[x].push_back(i+1);
}
if(t[i] == '?') {
rp.push_back(i+1);
} else {
int x = t[i] - 'a';
r[x].push_back(i+1);
}
}
for(int i = 0; i < 26; ++i) {
int lsz = (int)l[i].size(), rsz = (int)r[i].size();
int lpsz = (int)lp.size(), rpsz = (int)rp.size();
while(lsz >= 1 && rsz >= 1) {
ans.push_back({l[i][lsz-1], r[i][rsz-1]});
l[i].pop_back();
r[i].pop_back();
lsz--, rsz--;
}
while(lsz >= 1 && rpsz >= 1) {
ans.push_back({l[i][lsz-1], rp[rpsz-1]});
l[i].pop_back();
rp.pop_back();
lsz--, rpsz--;
}
while(rsz >= 1 && lpsz >= 1) {
ans.push_back({lp[lpsz-1], r[i][rsz-1]});
r[i].pop_back();
lp.pop_back();
rsz--, lpsz--;
}
}
int lpsz = (int)lp.size(), rpsz = (int)rp.size();
while(lpsz && rpsz) {
ans.push_back({lp[lpsz-1], rp[rpsz-1]});
lp.pop_back();
rp.pop_back();
lpsz--, rpsz--;
}
printf("%d\n", (int)ans.size());
for(auto x : ans) {
printf("%d %d\n", x.first, x.second);
}
return 0;
}
E题
题目
题意
有一只血量为\(H\)的怪物,每一轮有\(n\)个回合,每一回合血量的变化为\(d_i\),每一轮的变化情况都和上一轮一样,问怪物在第几回合死亡。
思路
暴力,不太擅长这种题……
代码实现如下
#include <set>
#include <map>
#include <deque>
#include <queue>
#include <stack>
#include <cmath>
#include <ctime>
#include <bitset>
#include <cstdio>
#include <string>
#include <vector>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef pair<LL, LL> pLL;
typedef pair<LL, int> pLi;
typedef pair<int, LL> piL;;
typedef pair<int, int> pii;
typedef unsigned long long uLL;
#define lson rt<<1
#define rson rt<<1|1
#define lowbit(x) x&(-x)
#define name2str(name) (#name)
#define bug printf("*********\n")
#define debug(x) cout<<#x"=["<<x<<"]" <<endl
#define FIN freopen("in","r",stdin)
#define IO ios::sync_with_stdio(false),cin.tie(0)
const double eps = 1e-8;
const int mod = 1e9 + 7;
const int maxn = 1e6 + 7;
const double pi = acos(-1);
const int inf = 0x3f3f3f3f;
const LL INF = 0x3f3f3f3f3f3f3f3fLL;
int n;
int d[maxn];
LL H, sum;
int main() {
#ifndef ONLINE_JUDGE
FIN;
#endif
scanf("%lld%d", &H, &n);
LL mx = inf;
for(int i = 1; i <= n; ++i) {
scanf("%d", &d[i]);
sum += d[i];
if(sum < 0) mx = min(mx, sum);
}
if(sum >= 0) {
for(int i = 1; i <= n; ++i) {
H += d[i];
if(H <= 0) {
printf("%d\n", i);
return 0;
}
}
printf("-1\n");
} else {
LL ans = 0;
for(int i = 1; i <= n; ++i) {
H += d[i];
if(H <= 0) {
printf("%d\n", i);
return 0;
}
}
ans += n;
sum = -sum;
ans += H / sum * n;
H %= sum;
if(mx != inf) {
mx = -mx;
ans -= (mx + sum - 1) / sum * n;
H += (mx + sum - 1) / sum * sum;
}
while(H > 0) {
for(int i = 1; i <= n; ++i) {
H += d[i];
if(H <= 0) {
ans += i;
break;
}
}
if(H > 0) ans += n;
}
printf("%lld\n", ans);
}
return 0;
}
F题
题目
题意
给你\(n\)个数,要你选择不相交的\(k\)个区间,使得这\(k\)个区间的和相同,最大化k。
思路
由于\(n\)很小,我们可以先暴力以\(i\)为左端点\(j\)为右端点这段区间的和,然后用一个\(vector\)来存下这个和对应的所有区间,然后对每个和的所有区间进行贪心取即可(贪心入门经典题)。
代码实现如下
#include <set>
#include <map>
#include <deque>
#include <queue>
#include <stack>
#include <cmath>
#include <ctime>
#include <bitset>
#include <cstdio>
#include <string>
#include <vector>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef pair<LL, LL> pLL;
typedef pair<LL, int> pLi;
typedef pair<int, LL> piL;;
typedef pair<int, int> pii;
typedef unsigned long long uLL;
#define x first
#define y second
#define lson rt<<1
#define rson rt<<1|1
#define lowbit(x) x&(-x)
#define name2str(name) (#name)
#define bug printf("*********\n")
#define debug(x) cout<<#x"=["<<x<<"]" <<endl
#define FIN freopen("in","r",stdin)
#define IO ios::sync_with_stdio(false),cin.tie(0)
const double eps = 1e-8;
const int mod = 1e9 + 7;
const int maxn = 2e6 + 7;
const double pi = acos(-1);
const int inf = 0x3f3f3f3f;
const LL INF = 0x3f3f3f3f3f3f3f3fLL;
int n;
int a[maxn], vis[maxn];
LL sum[maxn];
vector<LL> s;
vector<pii> v[maxn], seg;
int main() {
#ifndef ONLINE_JUDGE
FIN;
#endif
scanf("%d", &n);
for(int i = 1; i <= n; ++i) {
scanf("%d", &a[i]);
sum[i] = sum[i-1] + a[i];
for(int j = 1; j <= i; ++j) {
s.push_back(sum[i] - sum[j-1]);
}
}
sort(s.begin(), s.end());
s.erase(unique(s.begin(), s.end()), s.end());
int sz = s.size();
for(int i = 1; i <= n; ++i) {
for(int j = 1; j <= i; ++j) {
int x = sum[i] - sum[j-1];
int p = lower_bound(s.begin(), s.end(), x) - s.begin();
v[p].push_back({i, j});
}
}
for(int i = 0; i < sz; ++i) sort(v[i].begin(), v[i].end());
int ans = 0;
for(int i = 0; i < sz; ++i) {
int las = 0, cnt = 0;
for(int j = 0; j < v[i].size(); ++j) vis[j] = 0;
for(int j = 0; j < v[i].size(); ++j) {
if(v[i][j].y > las) {
cnt++;
vis[j] = 1;
las = v[i][j].x;
}
}
if(cnt > ans) {
seg.clear();
ans = cnt;
for(int j = 0; j < v[i].size(); ++j) {
if(vis[j]) {
seg.push_back({v[i][j]});
}
}
}
}
printf("%d\n", ans);
for(auto x : seg) {
printf("%d %d\n", x.y, x.x);
}
return 0;
}
G题
题目
题意
给你一棵树,需要将树进行染色,可以有\(k\)个结点(称为特殊点)使得它所连接的边颜色相同,其他的\(n-k\)个结点连接的边的颜色不能相同,要你最小化颜色数。
思路
要使得颜色数最少,我们很容易可以知道度最大的\(k\)个结点是特殊点(我们可以知道颜色数\(\equiv\)非特殊点中度最大的结点的度,因此要想最小化颜色数,就要最小化非特殊点中度最大的结点的度),剩下的dfs进行染色即可。
代码实现如下
#include <set>
#include <map>
#include <deque>
#include <queue>
#include <stack>
#include <cmath>
#include <ctime>
#include <bitset>
#include <cstdio>
#include <string>
#include <vector>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef pair<LL, LL> pLL;
typedef pair<LL, int> pLi;
typedef pair<int, LL> piL;;
typedef pair<int, int> pii;
typedef unsigned long long uLL;
#define lson rt<<1
#define rson rt<<1|1
#define lowbit(x) x&(-x)
#define name2str(name) (#name)
#define bug printf("*********\n")
#define debug(x) cout<<#x"=["<<x<<"]" <<endl
#define FIN freopen("in","r",stdin)
#define IO ios::sync_with_stdio(false),cin.tie(0)
const double eps = 1e-8;
const int mod = 1e9 + 7;
const int maxn = 1e6 + 7;
const double pi = acos(-1);
const int inf = 0x3f3f3f3f;
const LL INF = 0x3f3f3f3f3f3f3f3fLL;
int n, k, tot, ans;
int in[maxn], head[maxn], vis[maxn], c[maxn];
struct edge {
int v, next;
}ed[maxn];
void add(int u, int v) {
ed[tot].v = v;
ed[tot].next = head[u];
head[u] = tot++;
}
void dfs(int u, int p, int pp) {
int cnt = 0;
for(int i = head[u]; ~i; i = ed[i].next) {
int v = ed[i].v;
if(v == p) continue;
if(vis[u]) c[i] = (pp == 0 ? 1 : pp);
else {
cnt++;
if(cnt == pp) cnt++;
c[i] = cnt;
}
dfs(v, u, c[i]);
}
ans = max(ans, max(1, cnt));
}
int main() {
#ifndef ONLINE_JUDGE
FIN;
#endif
scanf("%d%d", &n, &k);
int u, v;
for(int i = 1; i <= n; ++i) head[i] = -1;
for(int i = 1; i < n; ++i) {
scanf("%d%d", &u, &v);
add(u, v); add(v, u);
in[u]++, in[v]++;
}
priority_queue<pii> q;
for(int i = 1; i <= n; ++i) {
q.push({in[i], i});
}
int cnt = 0;
while(cnt < k) {
vis[q.top().second] = 1;
q.pop();
cnt++;
}
dfs(1, 0, 0);
printf("%d\n", ans);
for(int i = 0; i < tot; ++i) {
if(c[i] == 0) continue;
printf("%d ", c[i]);
}
printf("\n");
return 0;
}
Codeforces_Round_547 (Div. 3)题解的更多相关文章
- Codeforces Round #182 (Div. 1)题解【ABCD】
Codeforces Round #182 (Div. 1)题解 A题:Yaroslav and Sequence1 题意: 给你\(2*n+1\)个元素,你每次可以进行无数种操作,每次操作必须选择其 ...
- 喵哈哈村的魔法考试 Round #2 (Div.2) 题解
喵哈哈村的魔法考试 Round #2 (Div.2) 题解 A.喵哈哈村的战争 题解: 这道题就是for一遍,统计每个村子的战斗力的和,然后统计哪个村子的战斗力和大一点就好了. 唯一的坑点,就是这道题 ...
- 喵哈哈村的魔法考试 Round #1 (Div.2) 题解
喵哈哈村的魔法考试 Round #1 (Div.2) 题解 特别感谢出题人,qscqesze. 也特别感谢测题人Xiper和CS_LYJ1997. 没有他们的付出,就不会有这场比赛. A 喵哈哈村的魔 ...
- Educational Codeforces Round 63 (Rated for Div. 2) 题解
Educational Codeforces Round 63 (Rated for Div. 2)题解 题目链接 A. Reverse a Substring 给出一个字符串,现在可以对这个字符串进 ...
- Codeforces Round #608 (Div. 2) 题解
目录 Codeforces Round #608 (Div. 2) 题解 前言 A. Suits 题意 做法 程序 B. Blocks 题意 做法 程序 C. Shawarma Tent 题意 做法 ...
- Educational Codeforces Round 65 (Rated for Div. 2)题解
Educational Codeforces Round 65 (Rated for Div. 2)题解 题目链接 A. Telephone Number 水题,代码如下: Code #include ...
- Educational Codeforces Round 64 (Rated for Div. 2)题解
Educational Codeforces Round 64 (Rated for Div. 2)题解 题目链接 A. Inscribed Figures 水题,但是坑了很多人.需要注意以下就是正方 ...
- Codeforces Round #525 (Div. 2)题解
Codeforces Round #525 (Div. 2)题解 题解 CF1088A [Ehab and another construction problem] 依据题意枚举即可 # inclu ...
- Codeforces Round #528 (Div. 2)题解
Codeforces Round #528 (Div. 2)题解 A. Right-Left Cipher 很明显这道题按题意逆序解码即可 Code: # include <bits/stdc+ ...
随机推荐
- 常用的js片段
1.检查是否为微信浏览器 function isWxBrowser() { var ua = navigator.userAgent.toLowerCase(); if (ua.match(/Micr ...
- 修改mysql max_allowed_packet 配置
1:当前默认配置 mysql> show VARIABLES like '%max_allowed_packet%';+--------------------------+---------- ...
- 【转】pdf文件自动切白边
pdf文件自动剪裁(自动切白边) FROM:http://www.ai7.org/wp/html/754.html 可能用到的环境.工具:Ubuntu 10.04+TeXLive 2008+pdfcr ...
- AntDesign vue学习笔记(一)初始化项目
最近学习AntDesign组件使用,官方Pro例子集成度太高,不容易学习,将从最基础组件一个一个搭建. 1.创建Vue Cli项目 2.引入ant design组件 $ cnpm i --save a ...
- RWMutex:共享/专有的递归互斥锁
具有共享/独占访问权限,且具有升级/降级功能的互斥锁 介绍 我的目标是创建可以充当读/写锁定机制的对象.任何线程都可以锁定它以进行读取,但是只有一个线程可以锁定它以进行写入.在写入线程释放它之前,所有 ...
- flask源码系列
更新中 HTML文档中元素存在,但是在浏览器中不显示.一般用于配合JavaScript代码使用. 04 LocalStack和Local对象实现栈的管理 05 Flask源码之:配置加载 06 Fla ...
- 2019vivo秋招提前批笔试题第3题
笔试的时候没做出来,就顺手截图了. 虽然知道要用动态规划做,但我一直就不太懂动态规划.笔试完又花了2小时把它做出来了.也不知道性能怎么样,但还好做出来了. def solution(n, toltal ...
- SpringCloud整合sleuth,使用zipkin时不显示服务
转载于:https://www.cnblogs.com/Dandwj/p/11179141.html 原文地址:https://blog.csdn.net/weixin_30416497/articl ...
- 正在阅读的tex教程
https://liam.page/2014/09/08/latex-introduction/ https://www.jianshu.com/p/1d99b3c883a6 http://www.c ...
- 手写ORM入门篇(一)
对象关系映射(英语:(Object Relational Mapping,简称ORM,或O/RM,或O/R mapping),是一种程序技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换 . ...