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数字表示),输入棋盘上的任意两个坐标,判断这两个坐标对应的图案是否可以消除,消除的条件是图案相同且图案间连线的转角数不得超过2 。
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)和(2,3)中的1不能消去。
输入
输入为连续的整数,第1个数为棋盘行数m,第2个数为棋盘列数n,然后依次是m*n个棋盘数据(先行后列),最后,是两个坐标对应的行号和列号,m行n列的棋盘,共计输入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;}
- 2013 华为成都初赛 题目和解答
- 2013华为第五届编程大赛 成都初赛题目和解答
- 华为面试题目解答
- 天梯题目解答--通过初赛1-2
- 2012华为成都上机题目C++编程
- 2013华为杯编程大赛成都第三组试题--------题目 A: 路灯统计
- 2012届华为校园招聘上机考试题目--成都
- 第二届“华为杯”初赛题目C HUST
- 2011华为编程大赛初赛成都赛区试题(c语言b卷)
- 2013华为编程大赛初赛出试题
- 本周六华为机试,成功归来,发布所有题目和解答,攒人品,驾校求过~~
- 两道华为上机题目解答(Java语言)
- 【华为机试】题目+解答+自己不足+提升
- 天梯题目解答--通过初赛 3数论-4进制转换
- java解答 2005年百度之星程序设计大赛试题初赛题目
- 成都华为员工跳楼
- 题目解答
- 华为2012第四届编程大赛初赛题目(4-22下午)
- wikioi之1474 十进制转m进制
- WEB中文字体应用指南
- 数据 acm(to be continued)
- 关于ListView的 addHeaderView(...) 方法
- python多继承与mro
- 2013 华为成都初赛 题目和解答
- 谷歌浏览器“一样”的代码,不一样的结果
- 设计模式---建造者模式
- 经典Sql面试题收集!!
- ASCII Unicode utf-8 utf-16
- 第六周作业
- HDU 3695 Computer Virus on Planet Pandora AC自动机裸题
- 1. 线性表(用可动态分配的一维数组实现)
- 黑马程序员 java IO URL URLConnection