Part 1 思路
首先统计字符串里两种座位的数量,设学生数量为 a a a,老师数量为 b b b,学生座位数量为 x x x,老师座位数量为 y y y。
当 x + y < a + b x+y \lt a+b x+y<a+b 时,说明永远不够坐,输出 − 1 -1 −1,结束程序。
当 x ≥ a x \ge a x≥a 并且 y ≥ b y \ge b y≥b 时,说明不用修改,输出 0 0 0,结束程序。
当 x ≥ a x \ge a x≥a 但 y < b y < b y<b 时,说明需要将学生座位改成老师座位,即需要把老师差的座位补上,所以输出 b − y b-y b−y。
当 y ≥ b y \ge b y≥b 但 x < a x < a x<a 时,说明需要将老师座位改成学生座位,即需要把学生差的座位补上,所以输出 a − x a-x a−x。
有人会问,后两种情况中,如果老师或学生的座位不够给另一方,那不就错了吗?
其实在第一种情况中,我们就已经将这种情况排除了,这里给出证明过程。
以情况三为例,若出现以上座位不够给老师的情况,则
x
−
a
<
b
−
y
x-a \lt b-y
x−a<b−y
移项,得
x
+
y
<
a
+
b
x+y \lt a+b
x+y<a+b
与情况一相同。
情况四同理。
Part 2 AC Code
#include<iostream>
using namespace std;
int main(){
int a,b,x=0,y=0;
cin>>a>>b;
string s;
cin>>s;
for(int i=0;i<s.length();i++){
if(s[i]=='S') x++;
if(s[i]=='T') y++;
}
if(x+y<a+b){
cout<<-1;
return 0;
}
if(x>=a&&y>=b){
cout<<0;
return 0;
}
if(x>=a&&y<b) cout<<b-y;
if(y>=b&&x<a) cout<<a-x;
}