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