两数组找相同的元素-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; }
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; }
形式化算式 时间限制:C/C++语言 1000MS;其他语言 3000MS 内存限制:C/C++语言 65536KB;其他语言 589824KB 题目描述: 我们有如下形式化的数字 * *** *** * * *** *** *** *** *** *** * * * * * * * * * * * * * * * *** *** *** *** *** * *** *** * * * * * * * * * * * * * * * * *** *** * *** *** * *** *** *** (* 下附图片供参考) 分别表示 1 2 3 4 5 6 7 8 9 0 有如下形式化的符号: * * * * **** *** *** * * * * * * **** ** ** (* 下附图片供参考) 分别表示 + - * / = 小数点 输入 现在 将输入一个算式 输出 你要将该算式计算之后按照上述形式化的方式输出 各个数字和符号之间空两格 无法整除则保留两位小数 样例输入 10 + 31 样例输出 * *** *** * * * * * * * * * * **** * * * * * * *** *** * *** * * * * * * * **** * * * *** *** * * * (* 下附图片供参考) Hint 样例输入2: 2 / 5 样例输出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; }
第四题:任务执行策略
呜呜呜好难啊,干瞪眼一个小时没思路,最后暴力一发还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; }