[关闭]
@Dmaxiya 2020-08-24T23:48:42.000000Z 字数 4822 阅读 890

第二次集中练习题解

Hello_World


题目链接:第二次集中练习

题意链接:第二次集中练习翻译

A. 暴力

题解

判断元音字母与奇数个数的和。

过题代码

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstdlib>
  4. #include <cmath>
  5. #include <climits>
  6. #include <cstring>
  7. #include <string>
  8. #include <vector>
  9. #include <list>
  10. #include <queue>
  11. #include <stack>
  12. #include <map>
  13. #include <set>
  14. #include <bitset>
  15. #include <algorithm>
  16. #include <functional>
  17. #include <iomanip>
  18. using namespace std;
  19. #define LL long long
  20. const int maxn = 100;
  21. char str[maxn];
  22. char ch[10] = {'a', 'e', 'i', 'o', 'u', '1', '3', '5', '7', '9'};
  23. int main() {
  24. #ifdef LOCAL
  25. freopen("test.txt", "r", stdin);
  26. // freopen("out.txt", "w", stdout);
  27. #endif // LOCAL
  28. ios::sync_with_stdio(false);
  29. while(scanf("%s", str) != EOF) {
  30. int ans = 0;
  31. for(int i = 0; str[i]; ++i) {
  32. for(int j = 0; j < 10; ++j) {
  33. if(str[i] == ch[j]) {
  34. ++ans;
  35. }
  36. }
  37. }
  38. printf("%d\n", ans);
  39. }
  40. return 0;
  41. }

B. 贪心

题解

对所有线段排序后,取相邻的三条线段,判断能否构成一个非退化三角形,用加法注意爆 int。

过题代码

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstdlib>
  4. #include <cmath>
  5. #include <climits>
  6. #include <cstring>
  7. #include <string>
  8. #include <vector>
  9. #include <list>
  10. #include <queue>
  11. #include <stack>
  12. #include <map>
  13. #include <set>
  14. #include <bitset>
  15. #include <algorithm>
  16. #include <functional>
  17. #include <iomanip>
  18. using namespace std;
  19. #define LL long long
  20. const int maxn = 100000 + 100;
  21. int n;
  22. int num[maxn];
  23. int main() {
  24. #ifdef LOCAL
  25. freopen("test.txt", "r", stdin);
  26. // freopen("out.txt", "w", stdout);
  27. #endif // LOCAL
  28. ios::sync_with_stdio(false);
  29. while(scanf("%d", &n) != EOF) {
  30. for(int i = 0; i < n; ++i) {
  31. scanf("%d", &num[i]);
  32. }
  33. sort(num, num + n);
  34. bool flag = false;
  35. for(int i = 2; i < n; ++i) {
  36. if(num[i] - num[i - 1] < num[i - 2]) {
  37. flag = true;
  38. break;
  39. }
  40. }
  41. if(flag) {
  42. printf("YES\n");
  43. } else {
  44. printf("NO\n");
  45. }
  46. }
  47. return 0;
  48. }

C. 并查集

题解

并查集,将并查集内节点数量记到根上。

过题代码

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstdlib>
  4. #include <cmath>
  5. #include <climits>
  6. #include <cstring>
  7. #include <string>
  8. #include <vector>
  9. #include <list>
  10. #include <queue>
  11. #include <stack>
  12. #include <map>
  13. #include <set>
  14. #include <bitset>
  15. #include <algorithm>
  16. #include <functional>
  17. #include <iomanip>
  18. using namespace std;
  19. #define LL long long
  20. const int maxn = 30000 + 100;
  21. int n, m, num;
  22. int x, y;
  23. int fa[maxn];
  24. int sum[maxn];
  25. int Find(int x) {
  26. return (x == fa[x]? x: fa[x] = Find(fa[x]));
  27. }
  28. void unit(int x, int y) {
  29. int xx = Find(x);
  30. int yy = Find(y);
  31. if(xx != yy) {
  32. fa[xx] = yy;
  33. sum[yy] += sum[xx];
  34. }
  35. }
  36. void Init(int n) {
  37. for(int i = 0; i < n; ++i) {
  38. fa[i] = i;
  39. sum[i] = 1;
  40. }
  41. }
  42. int main() {
  43. #ifdef LOCAL
  44. freopen("test.txt", "r", stdin);
  45. // freopen("out.txt", "w", stdout);
  46. #endif // LOCAL
  47. ios::sync_with_stdio(false);
  48. while(scanf("%d%d", &n, &m), n != 0 || m != 0) {
  49. Init(n);
  50. for(int i = 0; i < m; ++i) {
  51. scanf("%d", &num);
  52. scanf("%d", &x);
  53. for(int j = 1; j < num; ++j) {
  54. scanf("%d", &y);
  55. unit(x, y);
  56. x = y;
  57. }
  58. }
  59. printf("%d\n", sum[Find(0)]);
  60. }
  61. return 0;
  62. }

D. dp

题解

将第一个序列的数字离散化为(映射到)对应的数字,对于没有出现的数字,映射到 ,然后对第二个序列的每个数字按照映射后的序列找最长递增子序列。对于已经 的同学,请再测试以下数据:
输入:
2
3 6 7
1 7 5 4 8 3 9
1 4 3 5 6 2 8 9
3 1 4
1 9
1 2 7 8 9
输出:
Case 1: 4
Case 2: 2

过题代码

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstdlib>
  4. #include <cmath>
  5. #include <climits>
  6. #include <cstring>
  7. #include <string>
  8. #include <vector>
  9. #include <list>
  10. #include <queue>
  11. #include <stack>
  12. #include <map>
  13. #include <set>
  14. #include <bitset>
  15. #include <algorithm>
  16. #include <functional>
  17. #include <iomanip>
  18. using namespace std;
  19. #define LL long long
  20. const int maxn = 300;
  21. int T, n, p, q, cnt;
  22. int *it;
  23. int f[maxn * maxn];
  24. int first[maxn * maxn], second[maxn * maxn];
  25. int num[maxn * maxn];
  26. int main() {
  27. #ifdef LOCAL
  28. freopen("test.txt", "r", stdin);
  29. // freopen("out.txt", "w", stdout);
  30. #endif // LOCAL
  31. ios::sync_with_stdio(false);
  32. scanf("%d", &T);
  33. for(int cas = 1; cas <= T; ++cas) {
  34. memset(f, 0, sizeof(f));
  35. scanf("%d%d%d", &n, &p, &q);
  36. for(int i = 1; i <= p + 1; ++i) {
  37. scanf("%d", &first[i]);
  38. f[first[i]] = i;
  39. }
  40. for(int i = 1; i <= q + 1; ++i) {
  41. scanf("%d", &second[i]);
  42. second[i] = f[second[i]];
  43. }
  44. cnt = 0;
  45. for(int i = 1; i <= q + 1; ++i) {
  46. if(second[i] != 0) {
  47. it = upper_bound(num, num + cnt, second[i]);
  48. if(it - num == cnt) {
  49. num[cnt++] = second[i];
  50. } else {
  51. *it = second[i];
  52. }
  53. }
  54. }
  55. printf("Case %d: %d\n", cas, cnt);
  56. }
  57. return 0;
  58. }

E. 贪心 + set

题解

按照花费从大到小排序,花费大的先选择大于等于原起飞时间最小的时间,从 中删掉该时间,依次往下取。

过题代码

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstdlib>
  4. #include <cmath>
  5. #include <climits>
  6. #include <cfloat>
  7. #include <cstring>
  8. #include <string>
  9. #include <vector>
  10. #include <list>
  11. #include <queue>
  12. #include <stack>
  13. #include <map>
  14. #include <set>
  15. #include <bitset>
  16. #include <algorithm>
  17. #include <ctime>
  18. #include <functional>
  19. #include <iomanip>
  20. using namespace std;
  21. #define LL long long
  22. const int maxn = 300000 + 100;
  23. int n, k;
  24. struct Node {
  25. int cost;
  26. int pos;
  27. Node() {}
  28. Node(int c, int p) {
  29. cost = c;
  30. pos = p;
  31. }
  32. };
  33. bool operator<(const Node &a, const Node &b) {
  34. return a.cost > b.cost;
  35. }
  36. vector<Node> vct;
  37. set<int> st;
  38. set<int>::iterator it;
  39. int cost[maxn];
  40. int ans[maxn];
  41. int main() {
  42. #ifdef LOCAL
  43. freopen("test.txt", "r", stdin);
  44. // freopen("out.txt", "w", stdout);
  45. #endif
  46. ios::sync_with_stdio(false);
  47. scanf("%d%d", &n, &k);
  48. for(int i = 1; i <= n; ++i) {
  49. scanf("%d", &cost[i]);
  50. vct.push_back(Node(cost[i], i));
  51. }
  52. sort(vct.begin(), vct.end());
  53. for(int i = 1; i <= n; ++i) {
  54. st.insert(i + k);
  55. }
  56. for(int i = 0; i < n; ++i) {
  57. it = st.upper_bound(vct[i].pos);
  58. int abs1 = INT_MAX;
  59. if(it != st.end()) {
  60. abs1 = abs(*it - vct[i].pos);
  61. }
  62. int abs2 = INT_MAX;
  63. if(it != st.begin()) {
  64. --it;
  65. abs2 = abs(*it - vct[i].pos);
  66. ++it;
  67. }
  68. if(abs1 < abs2) {
  69. ans[vct[i].pos] = *it;
  70. st.erase(it);
  71. } else {
  72. --it;
  73. ans[vct[i].pos] = *it;
  74. st.erase(it);
  75. }
  76. }
  77. LL sum = 0;
  78. for(int i = 1; i <= n; ++i) {
  79. sum += (LL)(abs(ans[i] - i)) * cost[i];
  80. }
  81. printf("%I64d\n", sum);
  82. for(int i = 1; i <= n; ++i) {
  83. if(i != 1) {
  84. printf(" ");
  85. }
  86. printf("%d", ans[i]);
  87. }
  88. return 0;
  89. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注