题目链接

传送门

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)题解的更多相关文章

  1. Codeforces Round #182 (Div. 1)题解【ABCD】

    Codeforces Round #182 (Div. 1)题解 A题:Yaroslav and Sequence1 题意: 给你\(2*n+1\)个元素,你每次可以进行无数种操作,每次操作必须选择其 ...

  2. 喵哈哈村的魔法考试 Round #2 (Div.2) 题解

    喵哈哈村的魔法考试 Round #2 (Div.2) 题解 A.喵哈哈村的战争 题解: 这道题就是for一遍,统计每个村子的战斗力的和,然后统计哪个村子的战斗力和大一点就好了. 唯一的坑点,就是这道题 ...

  3. 喵哈哈村的魔法考试 Round #1 (Div.2) 题解

    喵哈哈村的魔法考试 Round #1 (Div.2) 题解 特别感谢出题人,qscqesze. 也特别感谢测题人Xiper和CS_LYJ1997. 没有他们的付出,就不会有这场比赛. A 喵哈哈村的魔 ...

  4. Educational Codeforces Round 63 (Rated for Div. 2) 题解

    Educational Codeforces Round 63 (Rated for Div. 2)题解 题目链接 A. Reverse a Substring 给出一个字符串,现在可以对这个字符串进 ...

  5. Codeforces Round #608 (Div. 2) 题解

    目录 Codeforces Round #608 (Div. 2) 题解 前言 A. Suits 题意 做法 程序 B. Blocks 题意 做法 程序 C. Shawarma Tent 题意 做法 ...

  6. Educational Codeforces Round 65 (Rated for Div. 2)题解

    Educational Codeforces Round 65 (Rated for Div. 2)题解 题目链接 A. Telephone Number 水题,代码如下: Code #include ...

  7. Educational Codeforces Round 64 (Rated for Div. 2)题解

    Educational Codeforces Round 64 (Rated for Div. 2)题解 题目链接 A. Inscribed Figures 水题,但是坑了很多人.需要注意以下就是正方 ...

  8. Codeforces Round #525 (Div. 2)题解

    Codeforces Round #525 (Div. 2)题解 题解 CF1088A [Ehab and another construction problem] 依据题意枚举即可 # inclu ...

  9. Codeforces Round #528 (Div. 2)题解

    Codeforces Round #528 (Div. 2)题解 A. Right-Left Cipher 很明显这道题按题意逆序解码即可 Code: # include <bits/stdc+ ...

随机推荐

  1. 你该怎么学习C++——思想层面

    Javascript是世界上最受误解的语言,其实C++何尝不是.坊间流传的错误的C++学习方法一抓就是一大把.我自己在学习C++的过程中也走了许多弯路,浪费了不少时间. 为什么会存在这么多错误认识?原 ...

  2. angular4.x实现一个全选,反选,外加从下一页返回上一页,选中上一次的操作记录

    productMap:any = new Map<string, string>(); //定义一个map的数据模型 //只要操作这个checkbox 那么只管把数据全部勾起了就行了 刷新 ...

  3. Centos7根据yum源安装指定版本docker

    yum install -y yum-utils device-mapper-persistent-data lvm2 yum-config-manager --add-repo https://mi ...

  4. 如何优雅的使用telnet测试端口连通性

    telnet命令是TELNET协议的用户接口,它支持两种模式:命令模式和会话模式,虽然telnet支持许多命令,但大部分情况下,我们只是使用它查看目标主机是否打开了某端口(默认是23). 其执行结果有 ...

  5. [Linux]Linux下samba创建共享文件

    1. 安装samba服务 yum install -y samba 2. 创建需要共享的目录 在目录/home/xxxx/share xxx为用户名 mkdir share 修改该目录权限(上层文件夹 ...

  6. Python删除文件,空文件夹,非空文件夹

    首先,在Python中文件路径是这种格式: file_path1 = r'F:\test\1' 删除文件,命令 os.remove(file_path1) 删除空文件夹,命令 os.rmdir(fil ...

  7. Google Adsense(谷歌网站联盟)广告申请指南

    Google AdSense 是一种获取收入的快速简便的方法,适合于各种规模的网站发布商.它可以在网站的内容网页上展示相关性较高的 Google 广告,并且这些广告不会过分夸张醒目.由于所展示的广告同 ...

  8. 2017ACM/ICPC广西邀请赛 Color it

    Color it Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 132768/132768 K (Java/Others)Tota ...

  9. 推荐一款好用的json导出execl格式的文件的js工具-JsonExportExcel

    <html> <head> <meta charset="utf-8"> <title>json导出Excel</title& ...

  10. 【剑指offer】1+….+n,不能使用相关关键字

    题目描述 求1+2+3+...+n,要求不能使用乘除法.for.while.if.else.switch.case等关键字及条件判断语句(A?B:C). 分析:可以使用递归! class Soluti ...