20171214,一二两题

1.越越的交通指挥系统

(traffic.pas/c/cpp)

【问题描述】

2027年,越越从北大毕业,想为家乡诸暨做点贡献,越越的家乡诸暨市有很多交通路口,其中有26个交通路口在上下班高峰期总是堵车,严重影响市民的出行。于是交通管理部门研制了一批机器人交通警察,用它们来专门指挥这26个交通路口,但需要一个自动化指挥系统来指挥机器人的运作。这个任务交给了越越,越越的设计如下。

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

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

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

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

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

【输入】

 第一行:输入第一个机器人的名字(长度不超过250);

 第二行:输入第二个机器人的名字(长度不超过250)。

【输出】

1、当不能排除机器人时,在第一行输出“WuXiao”.

2、当两名机器人在路口上指挥交通时,在第一行输出“ZhiHui”,在第二行输出路口编号。

3、当两名机器人在路口上巡逻时,在第一行输出“XunLuo”,第二行输出巡逻的路口数,第三行输出巡逻线路。

解析:

这题真的是让我吐血三升,本来应该可以拿100,结果因为种种原因,只拿20(晕晕晕晕晕晕晕晕晕)。

我首先把机器人名字存到两个字符串里,然后把里面的字母用循环累加近两个数组,代码实现如下:

#include<bits/stdc++.h>
using namespace std;
int main()
{//包子皮不用说
string s1,s2;
int i,j,k,l1,l2,s=0,a[27]={},b[27]={};//变量
cin>>s1>>s2;
l1=s1.length(); l2=s2.length();//测长
for(i=0;i<=l1;i++) a[int(s1[i]-'A')+1]++;
for(i=0;i<=l2;i++) b[int(s2[i]-'A')+1]=1#include<bits/stdc++.h>
using namespace std;
int main()
{
string s1,s2;
int i,j,k,l1,l2,s=0,a[27]={},b[27]={};
cin>>s1>>s2;
l1=s1.length(); l2=s2.length();
for(i=0;i<=l1;i++) a[int(s1[i]-'A')+1]++;
for(i=0;i<=l2;i++) b[int(s2[i]-'A')+1]++;//分别存入累加

结果就错了,应该“=1”:

for(i=0;i<=l1;i++) a[int(s1[i]-'A')+1]=1;
for(i=0;i<=l2;i++) b[int(s2[i]-'A')+1]=1;

然后记录a+b=2的数量,并到着记录最后一个a+b=2的数量,代码实现如下:

for(i=1;i<=26;i++) if(a[i]+b[i]==2) s++;
for(i=26;i>=1;i--)
   if(a[i]+b[i]==2) 
   {
   k=i;
   break;
   }

最后进行判断s的三种不同情况并分别输出:

if(s==0) cout<<"WuXiao";
if(s==1) cout<<"ZhiHui"<<endl<<char(k+'A'-1);
if(s>1) 
{
cout<<"XLuo"<<endl<<s<<endl;
for(i=1;i<=k-1;i++)
if(a[i]+b[i]==2) cout<<char(i+'A'-1)<<'-';
cout<<char(k+'A'-1);
}
}

结果因为XLuo打成Xluo八十分没了,苍天啊!!!

最后代码如下:

#include<bits/stdc++.h>
using namespace std;
int main()
{
string s1,s2;
int i,j,k,l1,l2,s=0,a[27]={},b[27]={};
cin>>s1>>s2;
l1=s1.length(); l2=s2.length();
for(i=0;i<=l1;i++) a[int(s1[i]-'A')+1]=1;
for(i=0;i<=l2;i++) b[int(s2[i]-'A')+1]=1;
for(i=1;i<=26;i++) if(a[i]+b[i]==2) s++;
for(i=26;i>=1;i--)
   if(a[i]+b[i]==2) 
   {
   k=i;
   break;
   }
if(s==0) cout<<"WuXiao";
if(s==1) cout<<"ZhiHui"<<endl<<char(k+'A'-1);
if(s>1) 
{
cout<<"XLuo"<<endl<<s<<endl;
for(i=1;i<=k-1;i++)
if(a[i]+b[i]==2) cout<<char(i+'A'-1)<<'-';
cout<<char(k+'A'-1);
}
}

2.久知的加密工作

(password.pas/c/cpp)

【问题描述】

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

【输入】

原始字符串(长度不大于250)。

【输出】

新的字符串。

【输入输出样例1】

password.in

password.out

bcmatchingaef

efA6bc

【输入输出样例2】

password.in

password.out

cmmmcefffg

gM3cF3ce

样例2解释:cM3cefffg——cefffgM3c——ceF3gM3c——gM3cF3ce

分析:这题可以用链表来完成,无奈的是我没学过,这题大概是这样做的:将这串字符串的每一个字符与后面的字符进行比较,如果重复,则将小写字母改为大写,前后交换,再进行判断,直到不再有重复的小写字母,然后输出。(其实就是道强模拟。。。)

C++的许多操作与Pascal有很大差异,非常的难受。Pascal里很多函数在c++里都用不了

(由于本蒟蒻太懒,不想找AC代码,如有需要,请自行查找)

猜你喜欢

转载自blog.csdn.net/j1124911538/article/details/79083139