战马列队

前言
“逐梦之人必与时间角逐,追逐红日东升,直至暗夜升空。瞭望银月,仰望满天星辰,握紧双拳,向梦想坚定奔去。”欢迎来到嘟嘟课堂。今天给大家刷道水题——战马列队。
题目描述
马年到了,也到了检阅战马的时候。战马分为白色和棕色两种,一字排开,指挥官希望他的战马队列尽可能整齐好看,将相同颜色的战马放在一起。
大部分人都喜欢高头白马,因此,指挥官要求白马排在前面,棕马排在后面。现在, N匹战马都已经在广场列队。为了达到要求,指挥官可以调换任意一个位置上的战马(有充足的备用战马)。问至少调换多少匹可以达到要求。
输入
第一行一个整数 N, 表示已经排队的战马数量。
第二行一个字符串,表示当前队列从前到后战马的颜色,只包含两种字符,”W”表示白马,”B”表示黑马。
输出
输出一个数字,表示至少需要调换多少匹战马。
样例输入1
5
WWWBB
样例输出1
0
样例说明1
已经符合白马在前,棕马在后,不需要调换。
样例输入2
5
WBWBW
样例输出2
2
样例说明2
可以把棕马都换成白马 WWWWW,或者 WWWBB,都是符合要求的队列,至少调换2 匹。
数据范围限制
30%的数据 N<=20。
70%的数据 N<=500。
100%的数据 N<=1000。
思路
水题…
我们从前往后做一次前缀和(W和B分开做),从后往前也做一次,然后枚举每个点。
如果是B,那么当前点的答案就是前面的B的个数+后面的W的个数
如果小于答案,就更新。
代码

var     
        st:ansistring; 
        n,i,j,k,l,s,x:longint;
        f1,f2:array[0..1001,1..2]of longint;
        g:array[0..1001,0..1]of longint;
begin
        assign(input,'queue.in');
        assign(output,'queue.out');
        reset(input);
        rewrite(output);
        readln(n);
        readln(st);
        for i:=n downto 1 do
        begin
                f1[i]:=f1[i+1];
                case st[i] of
                'W':inc(f1[i,1]);
                'B':inc(f1[i,2]);
                end;
        end;
        for i:=1 to n do
        begin
                f2[i]:=f2[i-1];
                case st[i] of
                'W':inc(f2[i,1]);
                'B':inc(f2[i,2]);
                end;
        end;
        s:=maxlongint;
        for i:=1 to n do
        case st[i] of
        'B':if(s>f2[i,2]+f1[i,1]-1) then s:=f2[i,2]+f1[i,1]-1;
        end;
        if s>f1[1,2] then s:=f1[1,2];
        if s>f1[1,1] then s:=f1[1,1];
        writeln(s);
        close(input);
        close(output);
end.
### 关于PTA战马队列的C++实现 #### 问题分析 根据已知引用内容,虽然未直接提及“战马队列”的具体定义或题目描述,但从其他涉及队列操作的内容可以推测,“战马队列”可能是一个基于队列的数据结构应用问题。通常情况下,这类问题会涉及到队列的基本操作(如入队、出队、获取队列长度等),并可能附加特定逻辑条件。 以下是针对该问题的一个通用解决方案框架: --- #### 解决方案设计 为了满足题目需求,假设“战马队列”需要支持以下功能: 1. **入队 (`push`)**:将一个元素加入到队列尾部。 2. **出队 (`pop`)**:移除队列头部的元素,并返回其值。 3. **获取队列长度 (`size`)**:返回当前队列中的元素数量。 4. (可选)特殊规则处理:如果存在额外约束条件,则需在代码中体现。 下面提供了一个完整的 `MyQueue` 类实现[^2],以及如何扩展以适应潜在的复杂场景。 ```cpp #include <iostream> #include <vector> using namespace std; class MyQueue { private: vector<int> queueData; // 使用向量存储队列数据 public: // 入队操作 void push(int x) { queueData.push_back(x); } // 出队操作 int pop() { if (queueData.empty()) { cout << "Error: Queue is empty." << endl; return -1; // 返回错误标志 } int frontElement = queueData.front(); queueData.erase(queueData.begin()); return frontElement; } // 获取队列长度 int size() const { return queueData.size(); } // 判断队列是否为空 bool isEmpty() const { return queueData.empty(); } }; int main() { MyQueue q; int n, command, value; cin >> n; // 总操作次数 for (int i = 0; i < n; ++i) { cin >> command; switch (command) { case 1: // 入队 cin >> value; q.push(value); break; case 2: // 出队 if (!q.isEmpty()) { cout << q.pop() << endl; } else { cout << "Empty" << endl; } break; case 3: // 查询队列大小 cout << q.size() << endl; break; default: break; } } return 0; } ``` 上述代码实现了基础队列的功能,并通过命令输入控制不同操作行为。对于更复杂的“战马队列”,可以根据实际题目要求进一步调整逻辑。 --- #### 特殊情况考虑 如果有特殊的业务逻辑(例如优先级判断、过滤重复项等),可以在 `push` 方法中增加相应验证机制。例如,在引用[5]中提到了一种二分查找优化方法来维护有序序列[^5],这可能是某些变体题目的核心思想之一。 --- #### 测试用例示例 假设有如下测试用例: ``` Input: 7 1 4 1 5 1 6 2 3 1 7 2 Output: 4 2 5 ``` 解释: - 操作序列为依次执行入队(4),入队(5),入队(6),出队(),查询长度(),入队(7),再出队()。 - 输出结果分别为首次出队得到的数值、剩余队列长度以及第二次出队的结果。 --- ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值