第一题 #include<cstdio> #include<list> using namespace std; typedef struct Vertex {     list<int> houji; }Vertex; bool fetched[100020]; Vertex v[100020]; int routine[100020]; int maxLayer = 0; int bfs(int start, int layer) {     if (layer > maxLayer)         maxLayer = layer;     fetched[start] = true;     routine[start] = 0;     for (auto it = v[start].houji.begin(); it != v[start].houji.end(); it++) {         int no = *it;         routine[start] += bfs(no, layer+1);     }     routine[start] += v[start].houji.size() * 2;     return routine[start]; } int main() {     int n;     scanf("%d", &n);     for (int i = 0; i < n-1; i++) {         int from, to;         scanf("%d %d", &from, &to);         v[from].houji.push_back(to);     }     bfs(1, 0);     printf("%d", routine[1] - maxLayer);     return 0; } 第二题 #include<cstdio> #include<unordered_map> #include<list> using namespace std; int a[100040]; unordered_map<int, int> state; unordered_map<int, int> moreThanTNum; int writeState(int *a, int idx, int k, int t) {     unordered_map<int, int> digitNum;     for (int i = idx; i < idx + k; i++) {         int digit = a[i];         if (digitNum.find(digit) == digitNum.end()) {             digitNum[digit] = 1;         }         else {             digitNum[digit]++;         }     }     moreThanTNum[idx] = 0;     for (auto it = digitNum.begin(); it != digitNum.end(); it++) {         state[it->first] = it->second;         if (it->second >= t) {             moreThanTNum[idx]++;         }     }     return 0; } int main() {     int n, k, t;     scanf("%d %d %d", &n, &k, &t);     for (int i = 0; i < n; i++) {         scanf("%d", &a[i]);     }     int result = 0;     writeState(a, 0, k, t);     if (moreThanTNum[0] >= t) {         result++;     }     for (int idx = 1; idx <= n - k; idx++) {         int deleteDigit = a[idx - 1];         int addDigit = a[idx + k - 1];         state[deleteDigit]--;         if (state[deleteDigit] == t - 1) {             moreThanTNum[idx] = moreThanTNum[idx - 1] - 1;         }         else {             moreThanTNum[idx] = moreThanTNum[idx - 1];         }         if (state.find(addDigit) == state.end()) {             state[addDigit] = 1;         }         else {             state[addDigit]++;         }         if (state[addDigit] == t) {             moreThanTNum[idx] = moreThanTNum[idx] + 1;         }         if (moreThanTNum[idx] >= 1) {             result++;         }     }     printf("%d\n", result);     return 0; } 第二题O(n)的解法一直不对,直到交卷两分钟后找出来了bug……
点赞 评论

相关推荐

牛客网
牛客网在线编程
牛客网题解
牛客企业服务