2013 华为成都初赛 题目和解答

来源:互联网 发布:高尔夫球运动分析软件 编辑:程序博客网 时间:2024/04/29 10:18

1. 路灯统计:

    题目描述
某省会城市街道纵横交错,为了监控路灯的运行状况,每条街道使用一个数字字符串标识该街道上所有路灯的运行状况。
假设路灯只有如下3种状态(分别用数字0, 1, 2标识,一盏路灯只对应其中一种状态):
0 标识路灯熄灭;
1 标识路灯开启;
2 标识路灯故障;
请根据输入的字符串,找出该街道上连续的处于相同状态的路灯的最大个数。若两种状态的路灯数量相同,则返回最先出现的路灯状态。
   输入:
街道上连续的路灯组成的状态字符串。字符串中只包含数字,每个路灯的状态为0,1,2中的一种状态。如“1101”代表4盏路灯,第3盏路灯为熄灭状态,其它3盏为开启状态。
   输出:
连续为相同状态的路灯的最大数量;

上述路灯的状态;

要求:先输出数量,再输出状态,两个整数间采用一个空格间隔。如输出:
53 2
样例输入
112200111
样例输出
3 1


code:

/* * main.cpp * *  Created on: 2014-4-13 *      Author: zy *      输入:路灯的状态 *      输出:最多连续的个数,此时路灯的状态 */#include <iostream>#include<string>using namespace std;int main(){string str;cin >> str;int i=0;int maxCount = 0;int count = 1;char state='0';for( i = 0; i < str.length(); i++ ) {if(str[i] == str[i+1]) {count += 1;}else {if(count > maxCount) {maxCount = count;state = str[i];}else {maxCount = maxCount;}count = 1;}}cout << maxCount << " " << state << endl;return 0;}

2. 求复数的平均值

    题目描述  由实部和虚部组成,形如(a,bi)这样的数,称为复数。
    通信系统中,通常用32bit数来表示复数(高16bit表示实部,低16bit表示虚部),如整数524295(16进制为0x00080007)
所代表的复数,实部为0x0008,虚部为0x0007。  有别于实数运算,复数加、减、乘、除运算定义如下: 
复数加公式:(a,bi) + (c,di) = (a + c),(b + d)i 复数减公式:(a,bi) + (c,di) = (a - c),(b - d)i  
复数乘公式:(a,bi) * (c,di) = (ac - bd),(ad + bc)i 复数除公式:(a,bi) / N = (a/N),(b/N)i  
题目要求,输入N个复数,计算这个N个复数的平均值,
复数Avg = (复数1*复数2 + 复数3*复数4 + … + 复数N-1*复数N) / N。 
 复数加、复数减、复数乘、复数除的结果仍然为复数,实部和虚部均为16bit有符号数,
计算过程中,当结果大于32767(0x7fff)时,输出32767;当计算结果小于-32768(0x8000)时,输出-32768。 
 输入  输入共计两行   有别于实数运算,复数加减乘除运算定义如下第一行包含1个整数,表示输入复数个数N(N为偶数,N不大于1000)   第一行包含1个整数,
表示输入复数个数N(N为偶数,N不大于1000)  输出  经计算得到的复数的平均值。  
样例输入  4  262149,393223,524297,655371 

样例输出  -458693


code,参考:http://blog.csdn.net/xiaozhuaixifu/article/details/9842683:

/* * main.cpp * *  Created on: 2014-4-13 *      Author: zy *  funciton: *  用户输入N个复数,计算复数的平均值,其中定义了复数的运算 */#include<iostream>#include<vector>using namespace std;const int NUM=5;const int maxNum = 32767;const int minNum = -32768;class Comp {private:int real;int img;public:Comp(int r, int i){real = r;img = i;}Comp(){real = 0;img = 0;}void setReal(int r){real = r;if(real >= maxNum) real = maxNum;if(real <= minNum) real = minNum;}void setImg(int i){img = i;if(img >= maxNum) img = maxNum;if(img <= minNum) img = minNum;}int getReal(){return real;}int getImg(){return img;}long long getValue(){long long  k;k = real << 16;k = k + img;return k;}};int main(){int N;cin >> N;int tmp;int r,img;vector<Comp>buf;int i=0;//循环输入N个复数,并转换为实部和虚部,存储在容器里for(i=0; i< N; i++) {cin >> tmp;r = tmp >> 16;img = tmp & 65535;   //注意的&运算Comp aa(r,img);//aa.setReal(r);//aa.setImg(img);buf.push_back(aa);}//从容器里取出数据,进行求和和求平均的运算long long sum_real,sum_img;Comp sum;for(i=0; i<buf.size()-1; i+=2) {Comp temp1 = buf[i];Comp temp2 = buf[i+1];sum_real = temp1.getReal()*temp2.getReal() - temp1.getImg()*temp2.getImg();sum_img = temp1.getReal()*temp2.getImg() + temp1.getImg()*temp2.getReal();sum.setReal(sum.getReal()+sum_real);sum.setImg(sum.getImg()+sum_img);}sum.setReal(sum.getReal()/N);sum.setImg(sum.getImg()/N);cout << sum.getValue() << endl;return 0;}

3. 连连看游戏:

题目描述

连连看,你不会?那就out了!

给定一个连连看棋盘,棋盘上每个点有各种图案(用非0数字表示),输入棋盘上的任意两个坐标,判断这两个坐标对应的图案是否可以消除,消除的条件是图案相同且图案间连线的转角数不得超过

1    3    3    4

0    6    0    0

4    0    2    1

6    0    4    2

图中,(0,1)(0,2)中的3没有转角可以消去,(1,1)(3,0)中的6有一个转角可以消去,(2,0)(3,2)中的4有两个转角可以消去,而(0,0)(23)中的1不能消去。

输入

输入为连续的整数,第1个数为棋盘行数m,第2个数为棋盘列数n,然后依次是m*n个棋盘数据(先行后列),最后,是两个坐标对应的行号和列号,mn列的棋盘,共计输入m*n+6个数。

输出

如果图案不能消除,输出0;如果图案可以消除,输出消除路线上图案个数(包含输入的两个图案,不考虑有多条可消除路径的情况)。

样例输入

4,4,1,3,3,4,0,6,0,0,4,0,2,1,6,0,4,2,2,0,3,2

样例输出

4


code,参考:http://blog.csdn.net/wuxinliulei/article/details/17246793:

/* * main.cpp * *  Created on: 2014-4-14 *      Author: zy */#include<iostream>#include<cstring>#include<queue>#include<cstdio>#define MAXSIZE 1002using namespace std;typedef struct Node{    int x;     //x坐标    int y;     //y坐标    int dir;   //方向    int turn;  //换方向次数    int num;}node;node now;int m,n;int sx,sy,ex,ey;queue<node> q;int map[MAXSIZE][MAXSIZE];//记录地图坐标信息int min_turn[MAXSIZE][MAXSIZE];//记录到达改点的最少转向次数int d[4][2] ={{1,0},{0,1},{-1,0},{0,-1}}; //利用(dir+2)%4==i 判断是不是往回走了//空出边界来bool isLegal(int x,int y){    if(x<1||y<1||x>m||y>n)    {        return false;    }    return true;}bool bfs(){    node temp;    while(!q.empty())    {        now = q.front();        q.pop();        for(int i=0;i<4;i++)        {            if(i==(now.dir+2)%4) continue;            temp.x = now.x + d[i][0] , temp.y = now.y + d[i][1];            if(!isLegal(temp.x,temp.y))            {                continue;            }            if(i == now.dir) temp.dir = now.dir , temp.turn = now.turn;            else temp.dir = now.dir+1 ,temp.turn = now.turn;            if(temp.x == ex&&temp.y ==ey)            {                if(temp.turn <=2)                {                    temp.num++;                    now = temp;                    return true;                }            }            //等于也是要存进去的,因为方向可能是不同的            else if( map[temp.x][temp.y]==0 && min_turn[temp.x][temp.y]>=temp.turn&&temp.turn<=2)            {                temp.num = now.num +1;                q.push(temp);            }        }    }    return false;}int main(){    int i,j;    //输入数据的顺序,先是二维数组的大小,然后是矩阵的内容,最后是需要检查的两个点的坐标    cin >> m;    cin >> n;    for(i = 0 ; i < m; i++) {    for(j = 0; j<n; j++) {    cin >> map[i][j];    }    }    cin >> sx >> sy >> ex >> ey;//检查起点和终点对应的点是否相等,是否为0,是否为同一个点,如果满足任何一个的话,表示图案不能消除,直接输出0,退出程序if(map[sx][sy] !=map[ex][ey]||map[sx][sy]==0||map[ex][ey]==0||(sx==ex&&sy==ey)){cout << '0';return 0;}for(i=0;i<=m+1;i++)for(j=0;j<=n+1;j++){  min_turn[i][j] = MAXSIZE;}node start;        //将开始点的四个起始方向放入队列当中,然后分别再沿着四个方向查找        //这样可以找到到达每个点的最少转弯数for(i=0;i<4;i++){start.x = sx;  start.y = sy;  start.num = 1;  start.turn = 0;  start.dir = i;q.push(start);}min_turn[sx][sy] = 0;if(bfs()){cout << now.num;}else{cout << '0';}    return 0;}



0 0
原创粉丝点击