热门标签 | 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);}}}
}


推荐阅读
  • 在洛谷 P1344 的坏牛奶追踪问题中,第一问要求计算最小割,而第二问则需要找到割边数量最少的最小割。通过为每条边附加一个单位权值,可以在求解最小割时优先选择边数较少的方案,从而同时解决两个问题。这种策略不仅简化了问题的求解过程,还确保了结果的最优性。 ... [详细]
  • NOIP2000的单词接龙问题与常见的成语接龙游戏有异曲同工之妙。题目要求在给定的一组单词中,从指定的起始字母开始,构建最长的“单词链”。每个单词在链中最多可出现两次。本文将详细解析该题目的解法,并分享学习过程中的心得体会。 ... [详细]
  • 本文详细介绍了一种利用 ESP8266 01S 模块构建 Web 服务器的成功实践方案。通过具体的代码示例和详细的步骤说明,帮助读者快速掌握该模块的使用方法。在疫情期间,作者重新审视并研究了这一未被充分利用的模块,最终成功实现了 Web 服务器的功能。本文不仅提供了完整的代码实现,还涵盖了调试过程中遇到的常见问题及其解决方法,为初学者提供了宝贵的参考。 ... [详细]
  • 单链表的高效遍历及性能优化策略
    本文探讨了单链表的高效遍历方法及其性能优化策略。在单链表的数据结构中,插入操作的时间复杂度为O(n),而遍历操作的时间复杂度为O(n^2)。通过在 `LinkList.h` 和 `main.cpp` 文件中对单链表进行封装,我们实现了创建和销毁功能的优化,提高了单链表的使用效率。此外,文章还介绍了几种常见的优化技术,如缓存节点指针和批量处理,以进一步提升遍历性能。 ... [详细]
  • 使用Maven JAR插件将单个或多个文件及其依赖项合并为一个可引用的JAR包
    本文介绍了如何利用Maven中的maven-assembly-plugin插件将单个或多个Java文件及其依赖项打包成一个可引用的JAR文件。首先,需要创建一个新的Maven项目,并将待打包的Java文件复制到该项目中。通过配置maven-assembly-plugin,可以实现将所有文件及其依赖项合并为一个独立的JAR包,方便在其他项目中引用和使用。此外,该方法还支持自定义装配描述符,以满足不同场景下的需求。 ... [详细]
  • 本文介绍了如何利用 Delphi 中的 IdTCPServer 和 IdTCPClient 控件实现高效的文件传输。这些控件在默认情况下采用阻塞模式,并且服务器端已经集成了多线程处理,能够支持任意大小的文件传输,无需担心数据包大小的限制。与传统的 ClientSocket 相比,Indy 控件提供了更为简洁和可靠的解决方案,特别适用于开发高性能的网络文件传输应用程序。 ... [详细]
  • 经过两天的努力,终于成功解决了半平面交模板题POJ3335的问题。原来是在`OnLeft`函数中漏掉了关键的等于号。通过这次训练,不仅加深了对半平面交算法的理解,还提升了调试和代码实现的能力。未来将继续深入研究计算几何的其他核心问题,进一步巩固和拓展相关知识。 ... [详细]
  • 在 Linux 环境下,多线程编程是实现高效并发处理的重要技术。本文通过具体的实战案例,详细分析了多线程编程的关键技术和常见问题。文章首先介绍了多线程的基本概念和创建方法,然后通过实例代码展示了如何使用 pthreads 库进行线程同步和通信。此外,还探讨了多线程程序中的性能优化技巧和调试方法,为开发者提供了宝贵的实践经验。 ... [详细]
  • Codeforces 605C:Freelancer's Dreams —— 凸包算法解析与题解分析 ... [详细]
  • 在探讨P1923问题时,我们发现手写的快速排序在最后两个测试用例中出现了超时现象,这在意料之中,因为该题目实际上要求的是时间复杂度为O(n)的算法。进一步研究题解后,发现有选手使用STL中的`nth_element`函数成功通过了所有测试点。本文将详细分析这一现象,并提出相应的优化策略。 ... [详细]
  • 在处理木偶评估函数时,我发现可以顺利传递本机对象(如字符串、列表和数字),但每当尝试将JSHandle或ElementHandle作为参数传递时,函数会拒绝接受这些对象。这可能是由于这些句柄对象的特殊性质导致的,建议在使用时进行适当的转换或封装,以确保函数能够正确处理。 ... [详细]
  • Objective-C 中的委托模式详解与应用 ... [详细]
  • 本文深入解析了 Kuangbin 数学训练营中的经典问题——Ekka Dokka,并通过详细的代码示例和数学推导,探讨了该问题的多种解法及其应用场景。通过对算法的优化和扩展,本文旨在为读者提供全面的理解和实用的参考。 ... [详细]
  • 在本文中,我们将深入探讨C#中的构造函数及其应用场景。通过引入构造函数,可以有效解决在访问类属性时反复赋值导致的代码冗余问题,提高代码的可读性和维护性。此外,还将介绍构造函数的不同类型及其在实际开发中的最佳实践。 ... [详细]
  • 题目链接: Caninepoetry问题概述:给定一个仅包含小写字母的字符串,允许将任意位置的字符修改为任意其他小写字母。目标是通过最少次数的修改,使字符串中所有长度大于1的子串均满足特定条件。本文详细分析了该问题,并运用思维与贪心算法,提出了一种高效解决方案。通过对字符串的深入解析,我们探讨了如何在最小化修改次数的同时,确保所有子串符合要求。 ... [详细]
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社区 版权所有