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

两数组找相同的元素-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;

int main()
{
    freopen("in.txt", "r", stdin);
    int n, m;
    int x;
    bool first = true;
    set<int> a;
    scanf("%d", &n);
    for (int i = 0; i < n; ++i) scanf("%d", &x), a.insert(x);
    scanf("%d", &m);
    for (int i = 0; i < m; ++i) {
        scanf("%d", &x);
        if (a.find(x) != a.end()) {
            if (first) first = false; else printf(" ");
            printf("%d", x);
        }
    }
    return 0;
}
View Code

DAU 统计
时间限制:C/C++语言 2000MS;其他语言 4000MS
内存限制:C/C++语言 32768KB;其他语言 557056KB
题目描述:
日活跃用户数 (DAU) 是衡量一个产品表现的重要指标。
需要编写程序,根据给定的某一天的 N 条访问记录,对当天的用户总数 M 进行统计。
每个用户可能访问多次。
为了方便,我们用数字 (uid) 唯一标识每个用户。
输入
每一行包含一个 uid,遇到 0 时认为输入结束。
输入共包含 N+1 行,可认为是无序的。
输出
一个数字:去重后 uid 的数量 M。

样例输入
12933
111111
59220
69433
59220
111111
0
样例输出
4

Hint
数据范围
0 < uid < 2^63
对于 30% 的数据,0 < N < 100,000, 0 < M < 100,000
对于 100% 的数据,0 < N < 1,000,000, 0 < M < 800,000

统计不重复的数字,利用set就可以了= =也是简单题

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

int main()
{
    std::ios::sync_with_stdio(false);
    long long x;
    set<long long> st;
    while (cin >> x) {
        if (x == 0) break;
        st.insert(x);
    }
    cout << st.size();
    return 0;
}
View Code
形式化算式
时间限制:C/C++语言 1000MS;其他语言 3000MS
内存限制:C/C++语言 65536KB;其他语言 589824KB
题目描述:
我们有如下形式化的数字
  *    ***   ***   * *   ***   ***   ***   ***   ***   ***
  *      *     *   * *   *     *       *   * *   * *   * *
  *    ***   ***   ***   ***   ***     *   ***   ***   * *
  *    *       *     *     *   * *     *   * *     *   * *
  *    ***   ***     *   ***   ***     *   ***   ***   **** 下附图片供参考)

分别表示 1 2 3 4 5 6 7 8 9 0
有如下形式化的符号:
   *        * *    *   ****
  ***  ***   *    *
   *        * *  *     ****   **
                              **
​(* 下附图片供参考)

分别表示 + - * / = 小数点
输入
现在 将输入一个算式
输出
你要将该算式计算之后按照上述形式化的方式输出
各个数字和符号之间空两格
无法整除则保留两位小数

样例输入
10 + 31
样例输出
*  ***       ***  *        * *  *
*  * *   *     *  *  ****  * *  *
*  * *  ***  ***  *        ***  *
*  * *   *     *  *  ****    *  *
*  ***       ***  *          *  *
​(* 下附图片供参考)


Hint
样例输入2:
25
样例输出2:
***       ***        ***      * *
  *    *  *    ****  * *      * *
***   *   ***        * *      ***
*    *      *  ****  * *  **    *
***       ***        ***  **    *
​(* 下附图片供参考)

数据范围:
20%的数据 输入的数字和运算结果都是个位数
100%的数据保证 输入数字和答案都小于10000
100%的数据保证 输入数字不会出现小数
80%的数据保证 运算结果不会出现小数

第三题就是个大模拟,有点恶心就是了,写了半个多小时、、、、

#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("
");

    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
", 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("
");
        }
    } 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("
");
        }
    } 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("
");
        }
    } 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("
");
            }
        } 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("
");
            }
        }
    }

    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[N][N][M], sum[N][N], a[N][N], 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
", dp[n][0][m]);
    return 0;
}
原文地址:https://www.cnblogs.com/wenruo/p/6730544.html