企业网站建设情况汇报智慧团建如何转团关系
2026/6/9 20:26:31 网站建设 项目流程
企业网站建设情况汇报,智慧团建如何转团关系,ppt设计公司,wordpress站点的临时域名题目描述 给定一个正整数 nnn #xff0c;它的二进制表示为不含前导零的二进制字符串。我们需要将 nnn 表示为带符号的二进制表示#xff08; signedbinaryrepresentation\texttt{signed binary representation}signed binary representation #xff09;#xff0c;即它的二进制表示为不含前导零的二进制字符串。我们需要将n nn表示为带符号的二进制表示signed binary representation \texttt{signed binary representation}signed binary representation即n ∑ i 0 k a i × 2 i n \sum_{i0}^{k} a_i \times 2^ini0∑k​ai​×2i其中a i ∈ { − 1 , 0 , 1 } a_i \in \{-1, 0, 1\}ai​∈{−1,0,1}。在二进制表示中每一位a i a_iai​只能是0 00或1 11因此表示是唯一的。但是在带符号的二进制表示中每一位可以是− 1 -1−1、0 00或1 11因此表示不唯一。题目要求我们找到一种带符号的二进制表示使得其中非零数字即 1 11或− 1 -1−1的个数最少。如果存在多种最优解则输出其中字典序最小的一个按照ASCII \texttt{ASCII}ASCII码顺序比较其中字符的顺序为 - 0。输入包含多个测试用例最多25 2525个每个测试用例一行是一个正整数n 2 50000 n 2^{50000}n250000的二进制表示不含前导零。输入以n 0 n 0n0结束该行不需处理。对于每个测试用例输出一行给出满足条件的带符号二进制表示用字符表示 1 11-表示− 1 -1−10表示0 00且不含前导零。题目分析本题的关键在于理解如何通过带符号的二进制表示来减少非零数字的个数。观察普通的二进制表示连续的1 11串可以通过进位和借位的方式转换为更少的非零数字。例如二进制数7 77的普通表示是111 111111即4 2 1 421421其中有3 33个非零数字。但我们可以将其表示为100 − 100-100−即8 − 1 8-18−1这样只有2 22个非零数字 1 11和− 1 -1−1。更一般地连续的k kk个1 11可以表示为11 … 1 ⏟ k 个 2 k − 1 2 k − 2 0 \underbrace{1 1 \dots 1}_{k \text{个}} 2^k - 1 2^k - 2^0k个11…1​​2k−12k−20即一个 1 11在高位k − 1 k-1k−1个0 00在中间一个− 1 -1−1在最低位。这样就将k kk个非零数字减少到了2 22个。然而这还不是最优的。因为当我们进行这样的转换时会产生一个进位即将连续1 11串前面的0 00变为1 11。这个进位可能与更高位的1 11形成新的、更长的连续1 11串从而可以进一步优化减少更多的非零数字。解题思路基于以上分析我们可以设计一个贪心算法从二进制表示的最低位向最高位扫描处理连续的1 11串。算法步骤初始化在二进制字符串前添加一个字符0作为哨兵用于处理可能的最高位进位。从低位向高位扫描对于每个位置i ii从最低位到最高位如果当前字符是1则向前向高位方向寻找连续1的起始位置j jj即s [ j ] ′ 0 ′ s[j] 0s[j]′0′且s [ j 1.. i ] s[j1..i]s[j1..i]都是1。计算连续1 11的长度l e n i − j len i - jleni−j。如果l e n ≥ 2 len \ge 2len≥2则进行转换将s [ i ] s[i]s[i]改为-表示− 1 -1−1。将s [ j 1.. i − 1 ] s[j1..i-1]s[j1..i−1]改为0。将s [ j ] s[j]s[j]改为1进位。注意这里进位设为1而不是因为它可能与更高位的1构成更长的连续1 11串从而在后续扫描中被进一步优化。特殊情况如果l e n 2 len 2len2且j 0 j 0j0即连续两个1 11在最高位则直接将这两个位置设为不进行转换因为转换后最高位会变成-可能不是字典序最小。如果l e n 1 len 1len1单个1 11则直接将该位置设为。处理最高位进位扫描结束后如果哨兵位s [ 0 ] s[0]s[0]变成了1则将其改为。输出结果如果s [ 0 ] ′ 0 ′ s[0] 0s[0]′0′则从s [ 1 ] s[1]s[1]开始输出否则从s [ 0 ] s[0]s[0]开始输出。这样可以确保没有前导零。算法正确性说明该算法是贪心的从最低位开始每次遇到连续长度≥ 2 \ge 2≥2的1 11串就进行转换。这样做的正确性基于以下观察最优子结构一个数的最优带符号二进制表示其最低位的决策不会影响更高位的最优性因为转换只产生向高位的进位不影响已经处理过的低位。贪心选择性质对于连续的k kk个1 11立即进行转换变为2 k − 1 2^k - 12k−1总是比保持原样更优或至少不差当k ≥ 3 k \ge 3k≥3时严格更优k 2 k 2k2时需要特殊处理字典序。字典序最小由于我们从低位向高位处理且在高位尽量保持而不是-最终得到的表示在非零数字最少的前提下是字典序最小的。时间复杂度扫描整个字符串一次每次处理连续1 11串时可能会修改多个字符但每个字符最多被修改一次从1改为0或-因此总时间复杂度为O ( n ) O(n)O(n)其中n nn是二进制字符串的长度。由于n ≤ 50000 n \le 50000n≤50000算法完全可行。空间复杂度只需要存储输入字符串和一些辅助变量因此空间复杂度为O ( n ) O(n)O(n)。代码实现// Power Signs// UVa ID: 11166// Verdict: Accepted// Submission Date: 2025-12-20// UVa Run Time: 0.000s//// 版权所有C2025邱秋。metaphysis # yeah dot net#includebits/stdc.husingnamespacestd;constintMAXN50010;intmain(){chars[MAXN];while(scanf(%s,s1)1s[1]!0){s[0]0;intnstrlen(s1);// 从低位向高位扫描i从n到1for(intin;i0;i--){if(s[i]1){intji-1;// 向前寻找连续1的起始位置while(s[j]1)j--;// 检查连续1的长度// 连续1的长度≥2if(i-j2){// 特殊情况连续2个1且在最高位j0if(i-j2j0)s[i]s[i-1];else{// 一般情况转换连续1// 最后一个1变成-1s[i]-;// 中间的1变成0for(intki-1;kj;k--)s[k]0;// 进位前面的0变成1不变为因为有可能与前面的1构成更长的连续1串// 从而可以得到非0数字更少的表示从而可能会更优s[j]1;}}elses[i];// 单个1直接变成}}// 处理可能的最高位进位if(s[0]1)s[0];// 输出结果if(s[0]0)printf(%s\n,s1);elseprintf(%s\n,s);}return0;}示例分析样例输入10000 1111 10111 0样例输出0000 000- 00-解释10000 1000010000二进制16 1616没有连续1 11直接转换为0000。1111 11111111二进制15 1515从低位扫描连续4 44个1 11转换为1000 − 1000-1000−即000-。10111 1011110111二进制23 2323首先处理低三位111 111111转换为100 − 100-100−同时进位使前面变为1 11得到1100 − 1100-1100−。然后处理新的连续两个1 11在第二位和第三位但由于它们在最高位且长度为2 22不转换直接设为最终得到00-。总结本题是一道典型的贪心算法题目关键在于发现通过进位可以将连续的1 11串转换为更少的非零数字并且这种转换可以连锁进行从而得到全局最优解。算法的时间复杂度和空间复杂度都是线性的适合处理大规模的输入数据。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询