问题 F: Black&White

探讨了在有限次操作下,如何通过翻转01串中的特定位,以最大化串中连续相同字符的最大数量。文章提供了一种基于滑动窗口(尺取法)的高效算法实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述
你有一个长度为 n 的 01 串S,你可以执行最多 m 次操作。
对于每次操作,你可以选择一个位置 i 满足 1≤i≤n,翻转这一位的值,0变成1,1变成0。
定义一个 01 串的价值为其中最长连续0的个数和最长连续1的个数的较大值,求S在经过最多m次操作后的最大价值。

输入
第一行一个整数 T ,表示接下来有 T 个样例。
首先输入n,m,表示S串的长度n和操作次数m,其中1≤n≤100000,0≤m≤1000;
接下来输入一个长度为n的字符串S。

输出
一个整数,表示题面上描述的最大价值。

样例输入
复制样例数据
2
5 1
00101
2 1
01
样例输出
4
2

提示
第一个串翻转第三个位置,00001的价值为4;第二个串翻转第一个位置,11的价值为2。
思想:尺取,区间问题简单的可不可以先想一下尺取
这里就是让r++,cnt记录1的个数,直到当cnt的个数超过m个时,开始对l进行操作,让cnt–,意思是不反转他,直到r>n时停止,用num来记录最长的区间长度,最后返回就行了

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <stdlib.h>
#include <cstring>
typedef long long ll;
using namespace std;

string s;
int n,m;
int t;


int solve1(){
    int l=0,r=0,cnt=0,num=0;
    while(r<n){
        if(s[r]=='1')
            cnt++;
        while(cnt>m){
            if(s[l]=='1')
                cnt--;
                l++;
        }
        num=max(num,r-l+1);
        r++;
    }
    return num;
}

int solve0(){
    int l=0,r=0,cnt=0,num=0;
    while(r<n){
        if(s[r]=='0')
            cnt++;
        while(cnt>m){
            if(s[l]=='0')
                cnt--;
                l++;
        }
        num=max(num,r-l+1);
        r++;
    }
    return num;
}

int main(){
    cin>>t;
    while(t--){
        cin>>n>>m;
        cin>>s;
        int ans=max(solve0(),solve1());
        cout<<ans<<endl;
    }
    return 0;
}

<think>好的,我现在需要解决用户在SFML中遇到的编译错误:`qualified-id in declaration before '(' token`,具体是在定义`inline constexpr Color Black`时出现的。首先,我得理解这个错误的原因。 根据错误信息,`qualified-id`通常指在声明中使用了不正确的限定符或语法结构。例如,可能在类外部错误地使用了初始化语法。用户提到`inline constexpr Color Black`,可能是在尝试定义`sf::Color::Black`的常量表达式。 SFML的Color类中,Black是静态成员变量。查阅SFML文档,`sf::Color`的静态成员如Black、White等在头文件中已经定义为静态常量。例如,在SFML的源码中,可能有这样的定义: ```cpp class Color { public: static const Color Black; // 其他颜色定义... }; ``` 然后在对应的cpp文件中进行初始化: ```cpp const Color Color::Black(0, 0, 0); ``` 但C++17之后,允许在类内定义内联变量,所以用户可能想用`inline constexpr`来重新定义这些颜色,导致冲突。 用户可能在代码中这样写: ```cpp inline constexpr sf::Color Black(sf::Color(0, 0, 0)); // 错误示例 ``` 这里的问题在于,`sf::Color`已经有一个静态成员`Black`,用户尝试在全局命名空间重新定义,导致重复定义或者语法错误。此外,`constexpr`构造函数需要满足特定条件,而`sf::Color`的构造函数可能没有被声明为`constexpr`,导致无法在编译时初始化。 另外,用户可能错误地在某个作用域内使用了错误的语法,比如在类定义外部错误地初始化成员变量。例如: ```cpp struct MyClass { inline static constexpr sf::Color Black = sf::Color(0, 0, 0); // 如果sf::Color构造函数不是constexpr,这里会报错 }; ``` 如果`sf::Color`的构造函数不是`constexpr`,这里就会导致编译错误。 解决方案应该是直接使用SFML预定义的颜色,如`sf::Color::Black`,而不是重新定义。如果用户确实需要自定义颜色常量,应确保正确使用作用域和初始化方式,避免与SFML现有定义冲突,并检查构造函数是否允许`constexpr`。 需要验证SFML中`sf::Color`的构造函数是否标记为`constexpr`。查阅SFML文档或源码,发现SFML的Color构造函数在C++11及以后版本中被声明为`constexpr`,例如: ```cpp constexpr Color(uint8 red = 0, uint8 green = 0, uint8 blue = 0, uint8 alpha = 255); ``` 因此,用户如果在C++17或更高标准下,可以定义自己的constexpr颜色变量,但需要注意作用域。例如: ```cpp inline constexpr sf::Color MyBlack{0, 0, 0}; // 正确,使用统一初始化且不与SFML现有名称冲突 ``` 但如果用户错误地写成了`inline constexpr Color Black(...)`而没有正确限定命名空间,或者尝试在类定义外初始化静态成员时使用了错误语法,就会导致上述错误。 综上,用户错误的原因可能包括: 1. 重复定义与SFML已有的静态成员同名的变量。 2. 错误使用初始化语法,如使用括号代替花括号或赋值语法。 3. 在不支持constexpr构造函数的环境下使用constexpr。 解决方案步骤应为: 1. 检查是否与SFML现有颜色名称冲突,避免重复定义。 2. 确认使用正确的初始化语法,如统一初始化`{}`。 3. 确保编译器支持C++17及以上,并且SFML版本中Color的构造函数是constexpr。</think>### 解决SFML中`inline constexpr Color`定义错误的方法 在SFML中定义`inline constexpr Color`时出现`qualified-id in declaration before '(' token`错误,通常由以下原因导致: #### 1. **命名冲突与作用域问题** SFML的`sf::Color`类已预定义了常用颜色(如`Black`、`White`等)作为静态常量成员[^1]。若尝试在全局或类作用域中重新定义同名变量,会导致重复声明。 **错误示例**: ```cpp // 错误:与sf::Color::Black冲突 inline constexpr sf::Color Black(0, 0, 0); ``` **解决方案**: - 直接使用预定义颜色:`sf::Color::Black`。 - 若需自定义颜色,避免使用与SFML冲突的名称: ```cpp inline constexpr sf::Color MyBlack{0, 0, 0}; // 使用{}初始化 ``` --- #### 2. **构造函数未标记为`constexpr`** 若SFML的`Color`构造函数未声明为`constexpr`(取决于SFML版本和C++标准),则无法在编译期初始化。 **验证方法**: 检查SFML源码或文档中`Color`的构造函数是否包含`constexpr`关键字。例如,SFML 2.5+在C++11及以上支持如下定义: ```cpp constexpr Color(uint8 red, uint8 green, uint8 blue, uint8 alpha = 255); ``` **解决方案**: - 确保使用支持`constexpr`构造函数的SFML版本(如SFML 2.5+)。 - 若无法升级SFML,改用运行时初始化: ```cpp const sf::Color MyBlack = sf::Color(0, 0, 0); // 非constexpr ``` --- #### 3. **语法错误** 错误使用初始化符号(如`()`代替`{}`)或作用域限定符。 **错误示例**: ```cpp inline constexpr sf::Color Black = sf::Color(0, 0, 0); // 若构造函数非constexpr则报错 ``` **解决方案**: - 使用统一初始化语法`{}`: ```cpp inline constexpr sf::Color MyBlack{0, 0, 0}; // 正确 ``` --- #### 完整代码示例 ```cpp #include <SFML/Graphics.hpp> // 正确:自定义颜色(不与SFML冲突) inline constexpr sf::Color CustomBlack{0, 0, 0}; int main() { sf::RenderWindow window(sf::VideoMode(800, 600), "Color Demo"); sf::RectangleShape rect({100.f, 100.f}); rect.setFillColor(sf::Color::Black); // 使用SFML预定义颜色 // rect.setFillColor(CustomBlack); // 使用自定义颜色 while (window.isOpen()) { // 事件处理... } return 0; } ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值