📅time:8.21 - 8.22 🍔题目: 1116 Come on! Let’s C 判断素数 1117 Eddington Number sort 1118 Birds in Forest 并查集 1119 Pre- and Post-order Traversals 二叉树,前序+后序是否能确定中序 不会,懒得想,只想睡觉
素数 千万别忘了调用函数
1 2 3 4 5 6 7 void check () { for (int i = 2 ; i < N; i++) { if (prime[i]) for (int j = i + i; j < N; j += i) prime[j] = false ; } }
二叉树的序列转化 需要再去看一下前中后序的转换
附录 1116 Come on! Let’s C 20分 很简单的排序
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 #include <iostream> #include <map> using namespace std;int N;map<int , int >p; bool prime[10010 ];bool printed[10010 ];void check () { for (int i = 2 ; i < N; i++) { if (prime[i]) for (int j = i + i; j < N; j += i) prime[j] = false ; } } int main () { cin >> N; fill (prime, prime + N, true ); int id; for (int i = 1 ; i <= N; i++) { cin >> id; p[id] = i; } int n; cin >> n; for (int i = 0 ; i < n; i++) { cin >> id; printf ("%04d: " , id); if (p.find (id) == p.end ()) { printf ("Are you kidding?\n" ); continue ; } if (printed[id]) { printf ("Checked\n" ); continue ; } printed[id] = true ; if (p[id] == 1 ) { printf ("Mystery Award\n" ); } else if (prime[p[id]]) { printf ("Minion\n" ); } else { printf ("Chocolate\n" ); } } }
1117 Eddington Number 25分 sort()很简单的题目
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 #include <iostream> #include <algorithm> using namespace std;int N;int num[100010 ];int main () { cin >> N; for (int i=0 ;i<N;i++){ cin >> num[i]; } sort (num, num + N); int pos = N / 2 ; int ans = 0 ; for (int i = 0 ; i < pos; i++) { ans += num[i]; } int b = 0 ; for (int i = pos; i < N; i++) { b += num[i]; } cout << N % 2 << " " << b - ans; }
1118 Birds in Forest 20分并查集
做了一百遍的并查集还是有问题,注意寻找一个结点的根节点不是Fa[x],而是findfather(x),即使进行了路径压缩,也可能导致树有三层高。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 #include <iostream> #include <set> using namespace std;const int maxn = 10010 ;int N;int Fa[maxn];bool flag[maxn];set<int >birds; int findfather (int a) { int x = a; while (x != Fa[x]) { x = Fa[x]; } while (Fa[a] != x) { int temp = Fa[a]; Fa[a] = x; a = temp; } return x; } void Union (int a, int b) { int fa = findfather (a); int fb = findfather (b); if (fa != fb) { flag[fb] = false ; Fa[fb] = fa; } } int main () { cin >> N; for (int i = 1 ; i < maxn; i++) { Fa[i] = i; flag[i] = true ; } int n, first, other; for (int i = 0 ; i < N; i++) { cin >> n; cin >> first; birds.insert (first); for (int j = 1 ; j < n; j++) { cin >> other; birds.insert (other); Union (first, other); } } int tree = 0 ; for (auto it : birds) { if (flag[it]) tree++; } cout << tree << " " << birds.size () << endl; cin >> n; int a, b; for (int i = 0 ; i < n; i++) { cin >> a >> b; if (findfather (a) == findfather (b)) { cout << "Yes\n" ; } else cout << "No\n" ; } }
1119 Pre- and Post-order Traversals 0分 直接抄答案
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 #include <iostream> #include <vector> using namespace std;const int maxn = 31 ;int N;int pre[maxn];int post[maxn];vector<int >in; bool unique = true ;void travel (int preL,int preR,int postL,int postR) { if (preL == preR) { in.push_back (pre[preL]); return ; } if (pre[preL] == post[postR]) { int i = preL + 1 ; while (i <= preR && pre[i] != post[postR - 1 ]) { i++; } if (i - preL > 1 ) { travel (preL + 1 , i - 1 , postL, postL + (i - preL - 1 ) - 1 ); } else unique = false ; in.push_back (post[postR]); travel (i, preR, postL + (i - preL - 1 ), postR - 1 ); } } int main () { cin >> N; for (int i = 0 ; i < N; i++) { cin >> pre[i]; } for (int i = 0 ; i < N; i++) { cin >> post[i]; } travel (0 , N - 1 , 0 , N - 1 ); printf ("%s\n%d" , unique == true ? "Yes" : "No" , in[0 ]); for (int i = 1 ; i < in.size (); i++) printf (" %d" , in[i]); printf ("\n" ); return 0 ; }