美团笔试
题目一:
小明拿到了一个数列a1, a2, ... an,小明想知道存在多少个区间 [l, r] 同时满足下列两个条件:
- r - l + 1 = k;
- 在al, al+1, ... ar中,存在一个数至少出现了 t 次。
输出满足条件的区间个数。
输入:
输入第一行三个整数n, k, t(1 ≤ n, k, t ≤ 105);第二行 n 个整数,a1, a2, ... an(1 ≤ ai ≤ 105)。
输出:
输出一个数,问题的答案。
样例输入
5 3 2
3 1 1 1 2
样例输出
3
Hint
区间[1,3]中1出现了2次,区间[2,4]中1出现了3次,区间[3,5]中1出现了2次。所以一共有3个区间满足条件。
解题:
#include <iostream> #include <cstring> using namespace std; int arr[100000]; int temp[100000]; int main() { int k, n, t, ans = 0; cin >> n >> k >> t; for(int i = 0; i < n; ++i) { cin >> arr[i]; } for(int i = 0; i < n - k + 1; ++i) { // 遍历[l, r]内的每一个数 for(int j = i; j < i + 3; ++j) ++temp[arr[j]]; // 就像桶 for(int m = 0; m < 100000; ++m) { if(temp[m] >= t) ans++; } memset(temp, 0, 100000); } cout << ans << endl; }
分析:画图分析得到思路,就可以编码了。
题目二:
给定一张包含N个点、N-1条边的无向连通图,节点从1到N编号,每条边的长度为1。
假设你从1号节点出发并打算遍历所有节点,那么总路程至少是多少?
输入:
第一行包含一个整数N,1 ≤ N ≤ 105;
接下来N-1行,每行包含两个整数 X 和 Y ,表示 X 号节点和 Y 号节点之间有一条边,1 ≤ X, Y ≤ N。
输出:
总路程的最小值。
样例输入
4
1 2
1 3
3 4
样例输出
4
解题: