女士优先 南京理工考研机试题
思维题
思考
题意是对于任意男生,后面若是有女生,便可以在一秒内进行交换,问最少多少秒,停止交换
按照女生的顺序单独标号,对于第i个女生,停止交换的时间为\(t_i\),那么\(t_{i}+1\leq t_{i+1}\)
- 假设这两个女生之间没有男生,那么一定要等到第i个女生交换后,才交换第i+1个女生,\(t_{i}+1=t_{i+1}\)
- 假设这两个女生之间有男生,那么第i+1个女生一定要交换完中间的男生才能交换第i个女生\(t_{i}+1 < t_{i+1}\)
因此\(t_{i}+1\leq t_{i+1}\)
换一个角度考虑,一个女生前面有\(c_i\)个男生,那么\(c_i\leq t_i\),因为女生必然要和前面所有的男生交换
综上我们得到
\(max\{c_{i+1},t_i+1\}\leq t_{i+1}\)
这时我们思考一下等号是否能成立,等号成立,就解决这个问题了
分两种情况
-
\(c_{i+1}\geq t_i+1\)
\(t_{i+1}\geq c_i\) 说明第i+1个女生只和前面的所有男生交换,而前面还有女生,
假设此时不取等\(t_{i+1}> c_{i+1}\),此时第i+1个女生前面必然有女生(有女生在前面排队),如果有女生,那么\(t_{i+1}=t_i+1\),与前面矛盾,此时矛盾只存在取等的情况
-
\(c_{i+1}<t_i+1\)
\(t_{i+1}>=t_i+1\)此时的情况说明第i个女生和第i+1个女生之间可能存在男生,也可能不存在
假设此时不取等\(t_{i+1}>t_i+1\),此时说明在交换过程中,始终存在男生在中间,第i+1个女生一直在交换,\(t_{i+1}=c_{i+1}>t_i+1\),与前面的矛盾,所以只能\(t_{i}+1=t_{i+1}\)也只存在取等的情况
综上两种情况下均只能取等,答案即为下界
CODE
#include<bits/stdc++.h>
using namespace std;
string s;
int cnt;
int main(){
cin>>s;
string t;
int k=0;while(s[k]=='F' && k<s.length()) ++k;
t=s.substr(k);
int ans=0;
for(auto x:t){
if(x=='M') ++cnt;
else ans=max(ans+1,cnt);
}
cout<<ans<<endl;
return 0;
}
收获
这道题与该合集中前一道题类似,都是先得到了一个不等式,发现答案可以取到下界,问题就被解决了
怎么去解决思维题
思维题着重考察思考的过程,代码一般很少,而且,一定要充分的分析思考题的性质,因为它没有模板可以去套
思维题也告诉我们了一点,思考的越多,代码需要的越少,效率也就越高,一般来说越是暴力的做法,越说明人思考的越少

浙公网安备 33010602011771号