又一次痛失良机,总结下来就是:
1、实力不够,硬伤啊。。。。
2、心态不好,答题的时候没掌握好节奏,紧张到思路都乱了,,,
最后一道题都写好了,可惜有个小问题没能在有限的时间里面找出来,答题结束后,一杯水还没(四声)喝完就想出来了,,,,,,,,
以下是根据回忆和答题的时候本地IDE中调试用的程序。。。详细题目见牛客网。
第一题:
大致意思是:输入一个数-回车-输入一串字符-回车,第一行表示第二行中需要处理的字符串的组数,第二行是一串字符,每9个字符为一组,每组中第一个表示该组字符串后8个字符是否需要翻转。0:翻转。1:不翻转。
测试用例:
2
0abcdefgh1abcdefgh
输出结果:
hgfedcba abcdefgh
输出要求:行末无空格//这句话被我读题的时候漏下了,浪费了点时间。。。
#include <iostream>
#include <stdio.h>
#include <string>
using namespace std;
int main() {
string str;//0abcdefgh1abcdefgh
int groupNum = 0;
int j = 0;
cin >> groupNum;
cin >> str;
for (int i = 0; i < groupNum; i++) {
j = i * 9;
if (i != 0) {
cout << " ";
}
if (str[j] == '1') {
//big
for (int k = j+1; k < j + 9; k++) {
cout << str[k];
}
}
else {
for (int k = j + 8; k > j; k--) {
cout << str[k];
}
}
}
return 0;
}
第二题
题目描述的很有趣,什么蜂蜜采蜜呀,blabla~。
输入描述:
蜂巢为原点,外面有A,B,C,D,E五片花丛,坐标都是整数。
输出描述:
从出发到返回蜂巢最短路径的长度,并取整,取整就是直接舍掉小数点后面的值。
测试输入:
200 0 200 10 200 50 200 30 200 25
输出:
456
题目中提到最长路径取整,一开始在计算的时候都用的int,可是题中不是这个意思!提交的时候报了n次错,我才发现这个坑,当时很方啊!!!也是因为这里浪费了时间,最后一道题没有弄完。。心理素质真的很重要啊!
看到题的时候觉得似曾相识,记得有一个用递归解决的问题和这个很像,可是答题的时候大脑一片空白,根本想不起来,,,最后还是用暴力搜索吧。
#include <iostream>
#include <math.h>
using namespace std;
int main() {
int pos[6][2];
float dis = 0, disTemp[6];
float disOld= 214748364;
float pathLen[6][6];
float path[6];
float pathShort[6];
float passed[6];
pos[0][0] = 0;
pos[0][1] = 0;
for (int i = 1; i < 6; i++) {
cin >> pos[i][0];
cin >> pos[i][1];
}
for (int i = 0; i < 6; i++) {
for (int j = 0; j < 6; j++) {
pathLen[i][j] = sqrt((pos[i][0] - pos[j][0])*(pos[i][0] - pos[j][0]) + (pos[i][1] - pos[j][1])*(pos[i][1] - pos[j][1]));
}
}
for (int i = 0; i < 6; i++) {
path[0] = i;
for (int j = 0; j < 6; j++) {
if (i != j) {
path[1] = j;
disTemp[0] = pathLen[i][j];
for (int k = 0; k < 6; k++) {
if (k != i && k != j) {
path[2] = k;
disTemp[1] = disTemp[0] + pathLen[j][k];
for (int l = 0; l < 6; l++) {
if (l != i && l != j && l != k) {
path[3] = l;
disTemp[2] = disTemp[1] + pathLen[k][l];
for (int m = 0; m < 6; m++) {
if (m != i && m != j && m != k && m != l) {
path[4] = m;
disTemp[3] = disTemp[2] + pathLen[l][m];
for (int n = 0; n < 6; n++) {
if (n != i && n != j && n != k && n != l && n != m) {
path[5] = n;
disTemp[4] = disTemp[3] + pathLen[m][n];
disTemp[5] = disTemp[4] + pathLen[n][i];
}
}
if (disTemp[5] < disOld) {
disOld = disTemp[5];
for (int len = 0; len < 6; len++) {
pathShort[len] = path[len];
}
}
}
}
}
}
}
}
}
}
}//200 0 200 10 200 50 200 30 200 25
cout << (int)disOld ;
return 0;
}
第三题
以切水果游戏为背景,嗯,,,以后不玩这个游戏了,,,
搞错了一个定义域,还是太紧张啊!!!这么简单的题,竟然耗了近一个小时,最后还是通过率0.00%,华为实习可能就无缘了,交卷后接了杯水,还没喝完,就想到了哪里不对,改了一个}的位置然后把time直接cout出来就ok了,我自己测试了一下,随便画了几个点,应该是对的,,,,
题目描述:屏幕上的网格(40x50)里有若干水果,只能用直线切水果,问最少几次能把水果切完。如图,数字一样的表示一刀
输入描述:
第一行输入整数N,表示水果的数量
接下来输入的数成对输入,表示水果的坐标,用空格隔开。

程序输出
切水果需要的最少的刀数。
测试输入:
2
2 2
3 4
输出:
2
思路:在这种紧张、时间又有限的情况,最可靠的办法就是(一、二、三,一起说出来吧!)暴力搜索~
先遍历每一个方格,找到水果就开始切,横竖撇捺各切一刀,找到切到水果最多的方向,切的多的方向就是这一刀的方向,然后继续找下一个水果。。。。。。。开始切!
#include <iostream>
using namespace std;
int main() {
int mesh[40][50];
int tempx, tempy;
int row = 0;
int point = 0;
int pointTemp[4];//h,s,p,n
int time=0;
memset(mesh, 0, sizeof(mesh));
memset(pointTemp, 0, sizeof(pointTemp));
cin >> row;
for (int i = 0; i < row; i++) {
cin >> tempx;
cin >> tempy;
mesh[tempx][tempy] = 1;
point++;
}
int cutDir = 0;
for (int x = 0; x < 40; x++) {
for (int y = 0; y < 50; y++) {
//find num
if (mesh[x][y] == 1) {
//找到就切
time++;
mesh[x][y] = 0;
point--;
for (int h = 0; h < 50; h++) {
//横
if (mesh[x][h] == 1) {
pointTemp[0]++;
}
}
for (int s = 0; s < 40; s++) {
//竖
if (mesh[s][y] == 1) {
pointTemp[1]++;
}
}
for (int s = 0; s < 40; s++) {
for (int h = 0; h < 50; h++) {
if ((s + h) == (x + y) && mesh[s][h] == 1) {
//撇
pointTemp[2]++;
}
}
}
for (int s = 0; s < 40; s++) {
for (int h = 0; h < 50; h++) {
if ((40 + 50 - s + h) == (40 + 50 - x + y) && mesh[s][h] == 1) {
//n捺
pointTemp[3]++;
}
}
}
int bigTemp = pointTemp[0];
cutDir = 0;
for (int big = 1; big < 4; big++) {
if (pointTemp[big] > bigTemp) {
bigTemp = pointTemp[big];
cutDir = big;
}
}
switch (cutDir) {
case 0:
for (int h = 0; h < 50; h++) {
//横
if (mesh[x][h] == 1) {
mesh[x][h] = 0;
}
}break;
case 1:
for (int s = 0; s < 40; s++) {
if (mesh[s][y] == 1) {
mesh[s][y] = 0;
}
}break;
case 2:
for (int s = 0; s < 40; s++) {
for (int h = 0; h < 50; h++) {
if ((s + h) == (x + y) && mesh[s][h] == 1) {
mesh[s][h] = 0;
}
}
}break;
case 3:
for (int s = 0; s < 40; s++) {
for (int h = 0; h < 50; h++) {
if ((40 + 50 - s + h) == (40 + 50 - x + y) && mesh[s][h] == 1) {
mesh[s][h] = 0;
}
}
}break;
default:break;
}
}
}
}
cout << time <<endl;
return 0;
}