您的位置:首页 > 其它

今日头条2017校园招聘 春招4.18笔试

2017-04-18 21:23 651 查看
两数组找相同的元素-array
时间限制:C/C++语言 1000MS;其他语言 3000MS
内存限制:C/C++语言 65536KB;其他语言 589824KB
题目描述:
给两个整数(int)数组,输出相同的元素。
输入
给定两个整型数组[a1, a2, ...., am],[b1, b2, ..., bn]
输入格式如下,第一行给定第一个数组的大小m,接下来的m行为其数组元素a1 -- am,每行一个元素;第m+1行为第二个数组的大小n,接下来的n行为其数组元素b1 -- bn,也是每行一个元素。示例如下:
m
a1
a2

am
n
b1
b2

bn

输出
两个数组中相同的元素,以空格分隔在一行中显示,显示顺序为其在第二个数组中出现的顺序。

样例输入
5
11
15
9
12
3
4
11
3
9
7

样例输出
11 3 9

开始用cin cout然后一直超时 苦思好久= =智障日常

#include<bits/stdc++.h>
using namespace std;

string digit[10][5];
string opr[6][5];   // + - * / = .

void init() {
digit[0][0] = "***";
digit[0][1] = "* *";
digit[0][2] = "* *";
digit[0][3] = "* *";
digit[0][4] = "***";

digit[1][0] = "*";
digit[1][1] = "*";
digit[1][2] = "*";
digit[1][3] = "*";
digit[1][4] = "*";

digit[2][0] = "***";
digit[2][1] = "  *";
digit[2][2] = "***";
digit[2][3] = "*  ";
digit[2][4] = "***";

digit[3][0] = "***";
digit[3][1] = "  *";
digit[3][2] = "***";
digit[3][3] = "  *";
digit[3][4] = "***";

digit[4][0] = "* *";
digit[4][1] = "* *";
digit[4][2] = "***";
digit[4][3] = "  *";
digit[4][4] = "  *";

digit[5][0] = "***";
digit[5][1] = "*  ";
digit[5][2] = "***";
digit[5][3] = "  *";
digit[5][4] = "***";

digit[6][0] = "***";
digit[6][1] = "*  ";
digit[6][2] = "***";
digit[6][3] = "* *";
digit[6][4] = "***";

digit[7][0] = "***";
digit[7][1] = "  *";
digit[7][2] = "  *";
digit[7][3] = "  *";
digit[7][4] = "  *";

digit[8][0] = "***";
digit[8][1] = "* *";
digit[8][2] = "***";
digit[8][3] = "* *";
digit[8][4] = "***";

digit[9][0] = "***";
digit[9][1] = "* *";
digit[9][2] = "***";
digit[9][3] = "  *";
digit[9][4] = "***";

opr[0][0] = "   ";
opr[0][1] = " * ";
opr[0][2] = "***";
opr[0][3] = " * ";
opr[0][4] = "   ";

opr[1][0] = "   ";
opr[1][1] = "   ";
opr[1][2] = "***";
opr[1][3] = "   ";
opr[1][4] = "   ";

opr[2][0] = "   ";
opr[2][1] = "* *";
opr[2][2] = " * ";
opr[2][3] = "* *";
opr[2][4] = "   ";

opr[3][0] = "   ";
opr[3][1] = "  *";
opr[3][2] = " * ";
opr[3][3] = "*  ";
opr[3][4] = "   ";

opr[4][0] = "    ";
opr[4][1] = "****";
opr[4][2] = "    ";
opr[4][3] = "****";
opr[4][4] = "    ";

opr[5][0] = "  ";
opr[5][1] = "  ";
opr[5][2] = "  ";
opr[5][3] = "**";
opr[5][4] = "**";

}
//
//   *        * *    *   ****
//  ***  ***   *    *
//   *        * *  *     ****   **
//                              **

//  *    ***   ***   * *   ***   ***   ***   ***   ***   ***
//  *      *     *   * *   *     *       *   * *   * *   * *
//  *    ***   ***   ***   ***   ***     *   ***   ***   * *
//  *    *       *     *     *   * *     *   * *     *   * *
//  *    ***   ***     *   ***   ***     *   ***   ***   ***

void print_num(int x, int p) {   // 输出数字x的第p行

int dig[10], idx = 0;
do {
dig[idx++] = x % 10;
x /= 10;
} while (x);

//    for (int i = idx-1; i >= 0; --i) {
//        printf("%d", dig[i]);
//        if (i) printf(" ");
//    }
//    printf("\n");

for (int i = idx-1; i >= 0; --i) {
cout << digit[ dig[i] ][p];
if (i) cout << "  ";
}

}

void print_double(double x, int p) {   // 输出数字x的第p行
int x1 = x;
int x2 = ceil((x - x1) * 100);

int dig[10], idx = 0;
do {
dig[idx++] = x1 % 10;
x1 /= 10;
} while (x1);

for (int i = idx-1; i >= 0; --i) {
cout << digit[ dig[i] ][p];
cout << "  ";
}
cout << opr[5][p];
cout << "  ";
cout << digit[ x2 / 10 ][p];
if (x2 % 10 != 0) {
cout << "  ";
cout << digit[ x2 % 10 ][p];
}

}

int main()
{
freopen("in.txt", "r", stdin);
freopen("out.txt", "w", stdout);
int a, b, ans;
char op;

init();

//print_num(120, 0);

scanf("%d%*c%c%*c%d", &a, &op, &b);

//printf("%d %c %d\n", a, op, b);

if (op == '+') {
ans = a + b;
for (int i = 0; i < 5; ++i) {
print_num(a, i);
printf(" ");
printf(" ");
cout << opr[0][i];
printf(" ");
printf(" ");
print_num(b, i);
printf(" ");
printf(" ");
cout << opr[4][i];
printf(" ");
printf(" ");
print_num(ans, i);
printf("\n");
}
} else if (op == '-') {
ans = a - b; bool mi = false;
if (ans < 0) mi = true, ans = -ans;
for (int i = 0; i < 5; ++i) {
print_num(a, i);
printf(" ");
printf(" ");
cout << opr[1][i];
printf(" ");
printf(" ");
print_num(b, i);
printf(" ");
printf(" ");
cout << opr[4][i];
printf(" ");
printf(" ");

if (mi) {
cout << opr[1][i];
printf(" ");
printf(" ");
}

print_num(ans, i);
printf("\n");
}
} else if (op == '*') {
ans = a * b;
for (int i = 0; i < 5; ++i) {
print_num(a, i);
printf(" ");
printf(" ");
cout << opr[2][i];
printf(" ");
printf(" ");
print_num(b, i);
printf(" ");
printf(" ");
cout << opr[4][i];
printf(" ");
printf(" ");
print_num(ans, i);
printf("\n");
}
} else {
if (a % b == 0) {
ans = a / b;
for (int i = 0; i < 5; ++i) {
print_num(a, i);
printf(" ");
printf(" ");
cout << opr[3][i];
printf(" ");
printf(" ");
print_num(b, i);
printf(" ");
printf(" ");
cout << opr[4][i];
printf(" ");
printf(" ");
print_num(ans, i);
printf("\n");
}
} else {
double fans = (double)a / b;
//printf("%f", fans);
for (int i = 0; i < 5; ++i) {
print_num(a, i);
printf(" ");
printf(" ");
cout << opr[3][i];
printf(" ");
printf(" ");
print_num(b, i);
printf(" ");
printf(" ");
cout << opr[4][i];
printf(" ");
printf(" ");
print_double(fans, i);
printf("\n");
}
}
}

return 0;
}


View Code

第四题:任务执行策略





呜呜呜好难啊,干瞪眼一个小时没思路,最后暴力一发还TLE没分= =

官方题解:

动态规划题。首先把三角形翻转一下,从底部来考虑每个元素。dp[i][j][k]表示考虑到第(i,j)个,当前选取了k个元素的最大值。前缀和维护最大值,就可以把转移优化到O(1)。

#include <algorithm>
#include <cassert>
#include <cstring>
#include <cstdio>

const int N = 60;
const int M = 500 + 10;

int dp

[M], sum

, a

, n, m;

int main() {
assert(scanf("%d%d", &n, &m) == 2);
assert(1 <= n && n <= 50);
assert(1 <= m && m <= 500);
for (int i = 1; i <= n; ++ i) {
for (int j = 1; j <= i; ++ j) {
assert(scanf("%d", &a[i][j]) == 1);
assert(0 <= a[i][j] && a[i][j] <= 1000);
}
}

for (int i = 1; i <= n; ++ i) {
for (int j = 1; j <= i; ++ j) {
sum[i][j] = sum[i][j - 1] + a[n - j + 1][i - j + 1];
}
}

memset(dp, 200, sizeof(dp));
for (int i = 0; i <= n; ++ i) {
dp[i][0][0] = 0;
}
for (int i = 1; i <= n; ++ i) {
for (int j = i; j >= 0; -- j) {
for (int k = j; k <= m; ++ k) {
dp[i][j][k] = std::max(dp[i][j + 1][k],
dp[i - 1][std::max(0, j - 1)][k - j] + sum[i][j]);
}
}
}
printf("%d\n", dp
[0][m]);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: