热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

EducationalCodeforcesRound25题解

A.BinaryProtocol水题,模拟统计出连续的0隔开的每段1的个数即可。#includeusingnamespacestd;c

A. Binary Protocol

水题,模拟统计出连续的0隔开的每段1的个数即可。

#include
using namespace std;
char s[110];
int n;
int main()
{while(~scanf("%d", &n)){scanf("%s", s);int len &#61; strlen(s);int t &#61; 0;s[len] &#61; &#39;0&#39;;for(int i&#61;0; i<&#61;len; i&#43;&#43;){if(s[i] &#61;&#61; &#39;0&#39;){printf("%d", t);t &#61; 0;}else{t&#43;&#43;;}}printf("\n");}
}

B. Five-In-a-Row

把每个.位置用’X’替换之后去check即可&#xff0c;注意替换之后要换回来。

#include
using namespace std;
char maze[12][12];
bool check(int x, int y){maze[x][y]&#61;&#39;X&#39;;for(int i&#61;0; i<10; i&#43;&#43;){for(int j&#61;0; j<10; j&#43;&#43;){if(maze[i][j]&#61;&#61;&#39;O&#39;||maze[i][j]&#61;&#61;&#39;.&#39;) continue;int t1 &#61; 0, t2 &#61; 0, t3 &#61; 0, t4 &#61; 0;for(int k&#61;j; k<10; k&#43;&#43;){if(maze[i][k] &#61;&#61; &#39;X&#39;) t1&#43;&#43;;else break;}for(int k&#61;i; k<10; k&#43;&#43;){if(maze[k][j] &#61;&#61; &#39;X&#39;) t2&#43;&#43;;else break;}for(int k&#61;0; i&#43;k<10&&j&#43;k<10; k&#43;&#43;){if(maze[i&#43;k][j&#43;k]&#61;&#61;&#39;X&#39;) t3&#43;&#43;;else break;}for(int k&#61;0; i-k>&#61;0&&j&#43;k<10; k&#43;&#43;){if(maze[i-k][j&#43;k]&#61;&#61;&#39;X&#39;) t4&#43;&#43;;else break;}if(t1>&#61;5||t2>&#61;5||t3>&#61;5||t4>&#61;5){maze[x][y] &#61; &#39;.&#39;;return 1;}}}maze[x][y] &#61; &#39;.&#39;;return 0;
}
int main()
{for(int i&#61;0; i<10; i&#43;&#43;){scanf("%s", maze[i]);}for(int i&#61;0; i<10; i&#43;&#43;){for(int j&#61;0; j<10; j&#43;&#43;){if(maze[i][j]&#61;&#61;&#39;.&#39;){if(check(i,j)){puts("YES");return 0;}}}}puts("NO");return 0;
}

C. Multi-judge Solving

题意&#xff1a;在codeforces上有n个不同难度的题目需要你去解决&#xff0c;现在你在其他OJ上已经解决的最大难度的题目为k&#xff0c;你要解决一个难度为s的问题的前提条件是你当前解决的所有问题的最大难度d要大于等于s&#xff0c;现在cf上这些题目你需要全部去解决&#xff0c;现在问你要通过其他OJ解决几道问题才行

解法&#xff1a;当前的a[i]个问题中&#xff0c;如果这个问题难度a[i]*2小于k&#xff0c;那么k &#61; max(k,a[i])&#xff0c;因为我们可以解决这个问题并且更新k值&#xff0c;否则的话我们就一直递增这个k去找a[i]&#xff0c;这时候ans加加

#include
using namespace std;
int n, k, mx, a[1010];int main()
{while(~scanf("%d %d", &n,&k)){for(int i&#61;1; i<&#61;n; i&#43;&#43;) scanf("%d", &a[i]);sort(a&#43;1, a&#43;n&#43;1);mx &#61; k;int ans &#61; 0;for(int i&#61;1; i<&#61;n; i&#43;&#43;){if(mx>&#61;(a[i]&#43;1)/2){mx &#61; max(mx, a[i]);}else{while(2*mx *&#61;2;}mx &#61; max(mx, a[i]);}}printf("%d\n", ans);}
}

D. Suitable Replacement

题意&#xff1a;给了一个带有?的原串&#xff0c;又给了一个文本串&#xff0c;问把这些问号怎么替换可以使得文本串在原串的出现次数最多&#xff1f;

解法&#xff1a;贪心&#xff0c;把所有的?存下来&#xff0c;然后一个个的去补全一个完整的文本串肯定是最优的&#xff0c;还要注意处理最后剩下的一段。

#include
using namespace std;
char s[1000010], t[1000010];
int cnt[30];
vector <int> v;
int main()
{scanf("%s", s);scanf("%s", t);for(int i&#61;0; s[i]; i&#43;&#43;){if(s[i] &#61;&#61; &#39;?&#39;) v.push_back(i);else cnt[s[i]-&#39;a&#39;]&#43;&#43;;}int l &#61; 0, st &#61; 0, sz &#61; v.size(), len &#61; strlen(t);while(1){if(!cnt[t[st]-&#39;a&#39;]){if(lelse{break;}}else{cnt[t[st]-&#39;a&#39;]--;}st&#43;&#43;;if(st &#61;&#61; len) st &#61; 0;}for(int i&#61;l; i&#39;a&#39;;printf("%s\n", s);return 0;
}

E. Minimal Labels

题意&#xff1a;1.对于原来编号u,v的两点&#xff0c;若存在一条从u指向v的边&#xff0c;那么重新编号后&#xff0c;u的编号要小于v的编号。2.重新编号后&#xff0c;新的编号恰好构成一个1~N的排列。从1到N&#xff0c;依次输出该节点的新编号。如果有多种编号方案&#xff0c;输出字典序最小的方案。

解法&#xff1a;1.题目中给出边,那么存边时存&#xff0c;并记录入度。2.执行Topsort标准操作&#xff0c;压入大根堆中而不是栈中。 此时从N到1&#xff0c;依次给取出的堆顶元素进行编号。当然还有一种对应的小根堆的做法&#xff0c;为什么这种做法错了呢&#xff1f;
举个栗子&#xff1a;3 1 3 1 小根堆输出的是3 1 2而正确答案是2 3 1&#xff0c;官方题解也给出了证明。

这里写图片描述

#include
using namespace std;
const int maxn &#61; 2e6&#43;7;
int n, m, lable[maxn], du[maxn];
vector <int> G[maxn];
priority_queue <int> q;int main()
{while(~scanf("%d%d", &n,&m)){for(int i&#61;1; i<&#61;m; i&#43;&#43;){int u, v;scanf("%d %d", &u,&v);G[v].push_back(u);du[u]&#43;&#43;;}for(int i&#61;1; i<&#61;n; i&#43;&#43;) if(du[i]&#61;&#61;0) q.push(i);int ans &#61; n;while(!q.empty()){int x &#61; q.top(); q.pop();lable[x] &#61; ans--;for(auto i : G[x]){du[i]--;if(du[i] &#61;&#61; 0){q.push(i);}}}for(int i&#61;1; i<&#61;n; i&#43;&#43;){printf("%d ", lable[i]);}printf("\n");}return 0;
}

F. String Compression
题意&#xff1a;给了一个字符串&#xff0c;然后我们可以执行折叠操作&#xff0c;比如aaaa可以变成4a&#xff0c;其中前面的数字用10进制表示&#xff0c;然后要问这个字符串可能变成的字符串的最短长度。

解法&#xff1a;KMP&#43;DP。首先要懂一个东西&#xff0c;就是如何利用KMP的nxt数组求出字符串的周期。(周期就是len-nxt[len])&#xff0c;证明在白书上有&#xff0c;非常简单&#xff0c;不再赘述。这里讲讲这道题的做法&#xff0c;DP[i]表示到i字符能够择出的最短长度。那么可以转移到什么地方呢&#xff1f;我们通过枚举的方式&#xff0c;计算枚举的串是否为周期串进行转移即可。看代码吧&#xff0c;写的非常清楚。

复杂度O(n*n)

#include
using namespace std;
const int maxn &#61; 8005;
int n,fail[maxn][maxn], num[maxn], dp[maxn];
char s[maxn];
void Getmin(int &x, int y){if(y}
void getFail(){for(int st&#61;0; stint len&#61;n-st, j&#61;-1;fail[st][0]&#61;-1;for(int i&#61;1; iwhile(j>&#61;0&&s[st&#43;j&#43;1]!&#61;s[st&#43;i]) j&#61;fail[st][j];if(s[st&#43;j&#43;1]&#61;&#61;s[st&#43;i]) j&#43;&#43;;fail[st][i]&#61;j;}}
}
int main()
{scanf("%s", s);n &#61; strlen(s);for(int i&#61;1; i<&#61;n; i&#43;&#43;) num[i]&#61;num[i/10]&#43;1;memset(dp, 0x3f, sizeof(dp));getFail();//dp[0]&#61;0;for(int st&#61;0; stfor(int len&#61;1; st&#43;len<&#61;n; len&#43;&#43;){Getmin(dp[st&#43;len-1],dp[st-1]&#43;len&#43;1);int loop&#61;len-1-fail[st][len-1];if(len%loop&#61;&#61;0){Getmin(dp[st&#43;len-1], dp[st-1]&#43;loop&#43;num[len/loop]);}}}printf("%d\n", dp[n-1]);return 0;
}

G. Tree Queries

题意&#xff1a;给出一颗树&#xff0c;两种操作一种是把某一个点涂成黑色&#xff0c;另外一个是计算这个点到所有黑点的路径上的最小的点的标号。

解法&#xff1a;参见官方题解。

这里写图片描述

#include
using namespace std;
const int maxn &#61; 1000010;
int n, q, last, x, minn, f[maxn];
vector <int> G[maxn];
void dfs(int x, int val){f[x] &#61; val;for(auto v : G[x]){if(!f[v]) dfs(v, min(val, v));}
}
int main()
{while(~scanf("%d %d", &n,&q)){for(int i&#61;0; ifor(int i&#61;1; iint u,v;scanf("%d%d",&u,&v);G[u].push_back(v);G[v].push_back(u);}int op;scanf("%d %d", &op,&x);last &#61; 0;x &#61; (x&#43;last)%n&#43;1;minn &#61; x;dfs(x, x);q--;while(q--){scanf("%d %d", &op,&x);x &#61; (x&#43;last)%n&#43;1;if(op &#61;&#61; 1){minn &#61; min(minn, f[x]);}else{last &#61; min(minn, f[x]);printf("%d\n", last);}}}
}
#include
using namespace std;
const int maxn &#61; 1000010;
int n, q, last, x, minn, f[maxn];
vector <int> G[maxn];
void dfs(int x, int val){f[x] &#61; val;for(auto v : G[x]){if(!f[v]) dfs(v, min(val, v));}
}
int main()
{while(~scanf("%d %d", &n,&q)){for(int i&#61;0; ifor(int i&#61;1; iint u,v;scanf("%d%d",&u,&v);G[u].push_back(v);G[v].push_back(u);}int op;scanf("%d %d", &op,&x);last &#61; 0;x &#61; (x&#43;last)%n&#43;1;minn &#61; x;dfs(x, x);q--;while(q--){scanf("%d %d", &op,&x);x &#61; (x&#43;last)%n&#43;1;if(op &#61;&#61; 1){minn &#61; min(minn, f[x]);}else{last &#61; min(minn, f[x]);printf("%d\n", last);}}}
}


推荐阅读
  • 本文介绍了设计师伊振华受邀参与沈阳市智慧城市运行管理中心项目的整体设计,并以数字赋能和创新驱动高质量发展的理念,建设了集成、智慧、高效的一体化城市综合管理平台,促进了城市的数字化转型。该中心被称为当代城市的智能心脏,为沈阳市的智慧城市建设做出了重要贡献。 ... [详细]
  • This article discusses the efficiency of using char str[] and char *str and whether there is any reason to prefer one over the other. It explains the difference between the two and provides an example to illustrate their usage. ... [详细]
  • 电话号码的字母组合解题思路和代码示例
    本文介绍了力扣题目《电话号码的字母组合》的解题思路和代码示例。通过使用哈希表和递归求解的方法,可以将给定的电话号码转换为对应的字母组合。详细的解题思路和代码示例可以帮助读者更好地理解和实现该题目。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 本文介绍了P1651题目的描述和要求,以及计算能搭建的塔的最大高度的方法。通过动态规划和状压技术,将问题转化为求解差值的问题,并定义了相应的状态。最终得出了计算最大高度的解法。 ... [详细]
  • 本文介绍了解决二叉树层序创建问题的方法。通过使用队列结构体和二叉树结构体,实现了入队和出队操作,并提供了判断队列是否为空的函数。详细介绍了解决该问题的步骤和流程。 ... [详细]
  • Linux环境变量函数getenv、putenv、setenv和unsetenv详解
    本文详细解释了Linux中的环境变量函数getenv、putenv、setenv和unsetenv的用法和功能。通过使用这些函数,可以获取、设置和删除环境变量的值。同时给出了相应的函数原型、参数说明和返回值。通过示例代码演示了如何使用getenv函数获取环境变量的值,并打印出来。 ... [详细]
  • 本文介绍了一个题目的解法,通过二分答案来解决问题,但困难在于如何进行检查。文章提供了一种逃逸方式,通过移动最慢的宿管来锁门时跑到更居中的位置,从而使所有合格的寝室都居中。文章还提到可以分开判断两边的情况,并使用前缀和的方式来求出在任意时刻能够到达宿管即将锁门的寝室的人数。最后,文章提到可以改成O(n)的直接枚举来解决问题。 ... [详细]
  • 本文讨论了clone的fork与pthread_create创建线程的不同之处。进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合。在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。但是二者之间的通讯需要通过专门的通讯机制,另外通过fork创建子进程系统开销很大。因此,在某些情况下,使用clone或pthread_create创建线程可能更加高效。 ... [详细]
  • 本文介绍了深入浅出Linux设备驱动编程的重要性,以及两种加载和删除Linux内核模块的方法。通过一个内核模块的例子,展示了模块的编译和加载过程,并讨论了模块对内核大小的控制。深入理解Linux设备驱动编程对于开发者来说非常重要。 ... [详细]
  • 本文介绍了在iOS开发中使用UITextField实现字符限制的方法,包括利用代理方法和使用BNTextField-Limit库的实现策略。通过这些方法,开发者可以方便地限制UITextField的字符个数和输入规则。 ... [详细]
  • 本文介绍了Oracle存储过程的基本语法和写法示例,同时还介绍了已命名的系统异常的产生原因。 ... [详细]
  • 本文讲述了CodeForces1016C题目的解法。文章首先介绍了一种错误的理解,然后给出了正确的解法。其中,当位于一个角上时,有两种选择,一种是先一直走一行再返回来走,另一种是走到这一列的另一行上然后再往右走一列。作者给出了两种解法,一种是直接计算,一种是动态规划。最后,取两种解法的最优解作为答案。文章附上了源代码。 ... [详细]
  • [echarts] 同指标对比柱状图相关的知识介绍及应用示例
    本文由编程笔记小编为大家整理,主要介绍了echarts同指标对比柱状图相关的知识,包括对比课程通过率最高的8个课程和最低的8个课程以及全校的平均通过率。文章提供了一个应用示例,展示了如何使用echarts制作同指标对比柱状图,并对代码进行了详细解释和说明。该示例可以帮助读者更好地理解和应用echarts。 ... [详细]
  • 本文介绍了使用C++Builder实现获取USB优盘序列号的方法,包括相关的代码和说明。通过该方法,可以获取指定盘符的USB优盘序列号,并将其存放在缓冲中。该方法可以在Windows系统中有效地获取USB优盘序列号,并且适用于C++Builder开发环境。 ... [详细]
author-avatar
樊赜思
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有