题解&反思(2)

来源:互联网 发布:北海市网络预约车 编辑:程序博客网 时间:2024/05/16 08:17

1. 越越的交通系统

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

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

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

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

【输入】

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

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

【输出】

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

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

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

【输入输出样例1

traffic.in traffic.out

OPEN   XunLuo

CLOSE 2

E-O

 

【输入输出样例2

traffic.in   traffic.out

EPSON    XunLuo

SENPUM   4

E-N-P-S

分析:因为机器人的名字不长,所以可以依次枚举来判断,不会超时。然后只要再进行判断和输出即可,代码如下:

#include<bits/stdc++.h>

using namespace std;

int main()

{

string a,b;

char d[100000],k;

int s=0,sa,sb;

cin>>a;

cin>>b;

sa=a.size();

sb=b.size();

for(int i=0;i<=sa-1;i++)

 for(int j=0;j<=sb-1;j++)

  {

    if((int)a[i]==(int)b[j])

     {

       s++;

       d[s]=b[j];

         }

      }

    for(int i=1;i<=s-1;i++)

    for(int j=i+1;j<=s;j++)

    {

       if(d[i]>d[j])

       {

         k=d[i];

          d[i]=d[j];

          d[j]=k;

       }

    }

if(s==0)

 cout<<"WuXiao"<<endl;

else if(s==1)

 {

  cout<<"ZhiHui"<<endl;

    cout<<d[s]<<endl;

     }

     else

     if(s>1)

     {

      cout<<"XLuo"<<endl;

      cout<<s<<endl;

      sort(d+1-65,d+s-65);

      for(int i=1;i<=s-1;i++)

      if(d[i]!=0)

       cout<<d[i]<<'-';

      cout<<d[s]<<endl;

     }

     return 0;

}

但这个代码只得了80分,如果将样例改为:

APPLE

APDU

则输出为

XLuo

3

A-P-P

问题也很显而易见了,是因为没有去重(心情咸鱼)。改进后AC,代码为:

#include<bits/stdc++.h>

using namespace std;

int main()

{

string a,b;

bool c['a']={};

char d[10001];

int sum=0,k=0,e;

cin>>a>>b;

for(int i=0;i<a.size();i++)

{

   e=b.find(a[i]);

   if(e>-1) c[a[i]]=1;

    }

for(char i='A';i<='Z';i++)

 if(c[i]==1) sum++;

if(sum==0)

 cout<<"WuXiao"<<endl;

else if(sum==1)

{

cout<<"ZhiHui"<<endl;

for(char i='A';i<='Z';i++)

 if(c[i]==1)

  cout<<i<<endl;

}

else

{

cout<<"XLuo"<<endl;

cout<<sum<<endl;

for(char i='A';i<='Z';i++)

 if(c[i]==1)

 {

  k++;

 d[k]=i;

 if(d[k-1]!=0)

  cout<<d[k-1]<<'-';

 }

 cout<<d[k]<<endl;

}

return 0;

}

而且,用这种方法做,也减少了很多不必要的循环,减少了时间。

2. 久知的加密工作

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

【输入】

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

【输出】

新的字符串。

 

【输入输出样例1

password.in

password.out

bcmatchingaef

efA6bc

 

【输入输出样例2

password.in

password.out

cmmmcefffg

gM3cF3ce

 

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

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

C++的字符操作与Pascal有很大差异,很难受。尤其是滚字符串时清空处理(可能是有函数的,but我不知道啊awa)

(本题不附代码)

原创粉丝点击