MYC归来(2)第三次测试

T1:


小顾的家乡有很多交通路口,其中有26个交通路口在上下班高峰期总是堵车,严重影响市民的出行。于是交通管理部门研制了一批机器人交通警察,用它们来专门指挥这26个交通路口,但需要一个自动化指挥系统来指挥机器人的运作。

分别用大写英文字母A,B,C,Z表示这26个路口,并按如下的规则派出这些机器人到交通路口协助指挥交通:

1、每次派出两名机器人。

2、当两名机器人的名字中存在一个相同的字母时,这两名机器人便到对应的交通路口指挥交通;有多个字母相同时,两名机器人需要按字母的字典顺序到这些路口巡逻。

3、当两名机器人的名字中不存在相同的字母时,交警部门的派出指令无效(wuxiao)。

    假设这些机器人的名字全由大写字母组成,请你编一个程序,完成这个交通指挥系统。



字符串操作,模拟即可(结果我考试的时候没去重,丢了20分。。。)




#include<bits/stdc++.h>
using namespace std;
char a[27];
string s,s1;
int k,k1;
int main()
{
cin>>s;
cin>>s1;
for(int i=0;i<s.size();i++)
for(int j=0;j<s1.size();j++)
if(s[i]==s1[j])
{
a[++k]=s[i];
break;
}
if(k==0)
   cout<<"WuXiao"<<endl;
else if(k==1)
   {
    cout<<"ZhiHui"<<endl;
    cout<<a[1]<<endl;
   }
else 
   {
    cout<<"XLuo"<<endl;
      k1=k;
         for(int i=1;i<=k;i++)
if(a[i]==a[i-1]) k1--;
    cout<<k1<<endl;
    sort(a,a+k+1);
    for(int i=1;i<k;i++)
if(a[i]!=a[i-1])
    cout<<a[i]<<'-';
    cout<<a[k]<<endl;
   }
return 0;
}




T2:

小顾找了一份为一些文件的某些部分加密的工作,加密的部分是一串小写英文字母,加密的规则是这样的:要是连续出现相同的字母,则把他们替换成这个字母的大写形式,后面紧跟相同字母的个数,并把它之前跟之后的两端字符串调换,例如出现bcaaaaaaef,则字符串变成:efA6bc。然后重新扫描字符串,直到没有出现相同小写字母为止。




这字符串操作好像没什么思路可讲的。。。

不过需要注意的是,同一个字符可能会有10多个,因此还要判断2位数




(我这个程序没判断2位数,各位大佬自行修改





#include<bits/stdc++.h>
using namespace std;
string s,a,b,c;
int t,j,k,i;
char ch;
bool p=true,q;
int main()
{
cin>>s;
while(p)
{
a.clear();
b.clear();
c.clear();
q=false;
t=s.size();
   for(i=0;i<t;i++)
   if(s[i]==s[i+1])
   {
   q=true;
   break;
   }
   if(q)
   {
    k=0;
       j=i;
   ch=s[i];
   while(s[j]==ch)
   {
    k++;
    j++;
   }
   for(int kk=0;kk<i;kk++)
   a+=s[kk];
   for(int kk=j;kk<s.size();kk++)
   b+=s[kk];
   s=a+(char)(ch-32)+(char)(k+48)+b;
}
   else break;
   a.clear();
   b.clear();
   j=i;
   for(i=0;i<j;i++)
   a+=s[i];
   for(i=j;i<j+2;i++)
   b+=s[i];
   for(i=j+2;i<s.size();i++)
   c+=s[i];
   s=c+b+a;
    }
    cout<<s<<endl;
return 0;
}



T3:

在学习括号匹配的时候,小顾在思考一个无聊的问题:能否找出双括号匹配的对数。

具体问题是:给定长度为N(1 <= N <= 50,000)的只包含左右(小)括号的字符串。能否找出相邻的两个左括号,和两个相邻的右括号,并且左括号的位置比右括号的位置靠左。

当然这些两个左右括号很多,最终的问题是:能否找出有多少对不同的连续左右括号对。

例如:给定括号序列  )((()())()),有四对不同的括号对匹配,具体如下,你不必考虑括号匹配的就近原则,只要考虑左括号在右括号左边即可。

1. )((()())())

 ^^   ^^

2. )((()())())

 ^^  ^^

3. )((()())())

     ^^     ^^

4. )((()())())

 ^^      ^^





这道题用双重循环能拿很多分,不过想要AC还要优化一下







#include<bits/stdc++.h>
using namespace std;
string s,s1;
int k=0,t=0;
int ans=0;
int main()
{
cin>>s;
for(int i=1;i<s.size();i++)
if(s[i]=='('&&s[i-1]=='(')
   s1+='1';
else if(s[i]==')'&&s[i-1]==')')
   s1+='2';
for(int i=0;i<s1.size();i++)
{
if(s1[i]=='1')
t++;
if(s1[i]=='2')
ans+=t;
}
cout<<ans;
return 0;
}





这样就能优化到1重循环啦~~~



T4....我也没做出来,还是不讲了吧




         E        N        D

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值