链接:https://ac.nowcoder.com/acm/contest/61132/G 来源:牛客网 给定一个长度为n的01串,你需要选择一段任意长度(可以为0)的区间对其翻转,翻转后,求最长的一段连续的全是1的区间的长度。 输入描述: 输入共2行。 第一行一个整数n(1\leq n \leq 10^6)n(1≤n≤10 6 )。 第二行一个长度为n的01序列。 输出描述: 输出一个整数,表示最长的长度。 示例1 输入 复制 10 0111001011 输出 复制 5 说明 翻转区间[5,10],翻转为0111110100。
时间: 2024-04-12 07:34:23 浏览: 202
题目要求我们在一个长度为n的01串中选择一段任意长度的区间进行翻转,然后求翻转后最长的连续全为1的区间的长度。
我们可以使用一个变量count来记录当前连续全为1的区间的长度,使用一个变量maxCount来记录翻转后最长的连续全为1的区间的长度。
遍历整个01串,当遇到1时,count加1;当遇到0时,更新maxCount为count和maxCount的较大值,并将count重置为0。
最后返回maxCount即为所求的结果。
以下是示例代码实现:
```cpp
#include <iostream>
#include <string>
using namespace std;
int main() {
int n;
string s;
cin >> n >> s;
int count = 0;
int maxCount = 0;
for (int i = 0; i < n; i++) {
if (s[i] == '1') {
count++;
} else {
maxCount = max(count, maxCount);
count = 0;
}
}
maxCount = max(count, maxCount);
cout << maxCount << endl;
return 0;
}
```
希望能帮助到你!如果还有其他问题,请继续提问。
相关问题
链接:https://ac.nowcoder.com/acm/contest/61132/G 来源:牛客网 给定一个长度为n的01串,你需要选择一段任意长度(可以为0)的区间对其翻转,翻转后,求最长的一段连续的全是1的区间的长度。c++生成
以下是使用C++编写的解决方案:
```cpp
#include <iostream>
#include <vector>
int max_ones(std::vector<int>& nums) {
int n = nums.size();
std::vector<int> dp(n, 0); // dp数组记录以当前位置结尾的最长连续1的长度
int max_len = 0; // 最长连续1的长度
for (int i = 0; i < n; i++) {
if (nums[i] == 1) {
dp[i] = (i > 0) ? dp[i-1] + 1 : 1; // 当前位置是1,更新dp数组
} else {
dp[i] = 0; // 当前位置是0,重置dp数组
}
max_len = std::max(max_len, dp[i]); // 更新最长连续1的长度
}
return max_len;
}
int main() {
int n; // 01串的长度
std::vector<int> nums;
std::cin >> n;
for (int i = 0; i < n; i++) {
int num;
std::cin >> num;
nums.push_back(num);
}
int result = max_ones(nums);
std::cout << result << std::endl;
return 0;
}
```
请将上述代码保存为一个.cpp文件,然后使用C++编译器进行编译运行。在运行时,首先输入01串的长度n,然后依次输入n个数字,每个数字代表对应位置的元素(0或1)。
注意:上述代码是根据题目描述编写的,但在实际使用中,应该添加输入数据的验证和错误处理机制。
链接:https://ac.nowcoder.com/acm/contest/61132/L 来源:牛客网 给定两个正整数n,m,再给定长度为n的正整数序列a, 保证n为奇数。接下来m行,每行两个正整数p, x。表示把a[p]修改为x。对于每次操作输出修改后的中位数。写个c++的代码
以下是使用C++编写的解答:
```cpp
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
int n, m;
cin >> n >> m;
vector<int> a(n);
for (int i = 0; i < n; i++) {
cin >> a[i];
}
for (int i = 0; i < m; i++) {
int p, x;
cin >> p >> x;
a[p] = x;
sort(a.begin(), a.end());
cout << a[n / 2] << endl;
}
return 0;
}
```
首先,我们读取输入的n和m,以及长度为n的正整数序列a。
然后,我们使用循环读取m行的操作。每次操作中,我们读取p和x,并将a[p]修改为x。接下来,我们对序列a进行排序,然后输出修改后的中位数a[n / 2]。
最后,我们返回0,表示程序顺利结束。
请注意,该代码假设输入是有效的,并且没有进行输入验证。如果需要对输入进行验证,请根据题目要求进行适当的修改。
阅读全文