[关闭]
@jesseliu612 2020-05-15T16:54:26.000000Z 字数 2043 阅读 1234

2020程设期中解题报告 by Jesse


01:编程填空:第i字节

这题考察基本位运算。

  1. (x >> (8*i)) & ((1<<8) - 1);

02:编程填空:又双叒叕是Fun和Do!

稍微排列组合一下试试即可。

  1. virtual void Fun() {
  2. cout << "A::Fun()" << n+1 << endl;
  3. }

03:编程填空:变来变去的数

这题主要坑点在于如何输出 6 2 2,只要设置一个条件不减就可以了。

  1. static int counter;
  2. void print_avaliable() {
  3. cout << counter << " ";
  4. }
  5. virtual void work() {
  6. if(counter - 4 >= 0) counter -= 4;
  7. print_avaliable();
  8. }

04:编程填空:惊呆!分数竟然也能这样输入输出和运算!

重载练习题。

  1. friend Fraction operator * (const Fraction &x, const Fraction &y) {
  2. Fraction ret;
  3. ret.p = x.p * y.p;
  4. ret.q = x.q * y.q;
  5. int d = gcd(ret.p, ret.q);
  6. ret.p /= d;
  7. ret.q /= d;
  8. return ret;
  9. }
  10. friend Fraction operator * (const Fraction &x, const int &y) {
  11. Fraction ret;
  12. ret.p = x.p * y;
  13. ret.q = x.q;
  14. int d = gcd(ret.p, ret.q);
  15. ret.p /= d;
  16. ret.q /= d;
  17. return ret;
  18. }
  19. friend istream& operator >> (istream &is, Fraction &f) {
  20. int x,y;
  21. is >> x >> y;
  22. f.p = x; f.q = y;
  23. return is;
  24. }
  25. friend ostream& operator << (ostream &os, Fraction f) {
  26. int d = gcd(f.p, f.q);
  27. f.p /= d; f.q /= d;
  28. os << f.p;
  29. if (f.q != 1) os << "/" << f.q;
  30. return os;
  31. }
  32. Fraction(int x) : p(x), q(1) {}
  33. Fraction() {}

05:编程填空:Lambda函数可以这样用!

考察高阶 lambda 表达式的使用。

  1. auto f = [](int d) {
  2. return [d](int x) {
  3. return x % d == 0;
  4. };
  5. };

06:编程填空:序列累加与字符串复制

这题难点在于是把加了之后的结果复制num次,所以每次都需要复制好。

  1. template<typename T>
  2. class MyFunc {
  3. public:
  4. int num;
  5. T &result;
  6. T temp;
  7. MyFunc(int num, T &result): num(num), result(result) {temp = T();}
  8. void operator () (T &x) {
  9. temp += x;
  10. result = T();
  11. for (int i = 1;i <= num ;i += 1) result += temp;
  12. }
  13. };

07:石油交易

以下解法用到了 map 用迭代器访问是按照 key 从小到大排序的。

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. int main () {
  4. int n;
  5. cin >> n;
  6. string stmp;
  7. map<int,int> all;
  8. for (int i = 1; i <= n; i += 1) {
  9. cin >> stmp;
  10. if (stmp[0] == 'S') {
  11. int x,y;
  12. cin >> x >> y;
  13. if (all.count(y)) all[y] += x;
  14. else all[y] = x;
  15. } else {
  16. int x;
  17. cin >> x;
  18. int cost = 0;
  19. vector<map<int,int> ::iterator> remove;
  20. for (map<int,int>::iterator it = all.begin(); it != all.end() && x; ++it) {
  21. if(it->second <= x) {
  22. cost += (it->first) * (it->second);
  23. x -= it->second;
  24. it->second = 0;
  25. remove.push_back(it);
  26. } else {
  27. cost += x * it->first;
  28. it->second -= x;
  29. x = 0;
  30. }
  31. }
  32. for (auto &it: remove) {
  33. all.erase(it);
  34. }
  35. if (x) cost += 40 * x;
  36. cout << cost << endl;
  37. }
  38. }
  39. return 0;
  40. }

08:编程填空:a+b+c问题

难点在于需要重载从未重载过的 -> 号,试一下之后发现可以这样操作。

  1. class A {
  2. public:
  3. int x;
  4. A (int x) : x(x) {}
  5. int get_value () { return x; }
  6. A* operator -> () { return this; }
  7. };
  8. A operator + (const A x, const A *y) {
  9. return A(x.x + y->x);
  10. }
  11. class B : public A {
  12. public:
  13. B (int x) : A(x) {}
  14. };
  15. class C : public A {
  16. public:
  17. C (int x) : A(x) {}
  18. };
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注