• 9.30~10.5新生赛C~J题


    C题 

    类似三色问题

    原思路是深搜,但会超时

    1. int n, m;
    2. //char mp[2005][2005], ch[3] = { 'R','G','B' };
    3. //bool hv = false;
    4. //bool can[2005][2005][3];
    5. bool check(int r,int c,int i) {
    6. if (ch[i] == mp[r][c - 1] || ch[i] == mp[r - 1][c]||ch[i]==mp[r-1][c+1]) {
    7. can[r][c][i] = false;
    8. }
    9. else {
    10. return true;
    11. }
    12. }
    13. rgb,brg,gbr
    14. //void beg(int r,int c) {
    15. // if (r == n + 1) {
    16. // hv = true;
    17. // return;
    18. // }
    19. // if (c == m + 1) {
    20. // beg(r + 1, 1);
    21. // }
    22. // else {
    23. // for (int i = 0; i <= 2; i++) {
    24. // if (ch[i] == mp[r][c - 1] || ch[i] == mp[r - 1][c] || ch[i] == mp[r - 1][c + 1]) {
    25. // continue;
    26. // }
    27. // mp[r][c] = ch[i];
    28. // beg(r, c + 1);
    29. // if (hv) {
    30. // break;
    31. // }
    32. // }
    33. // }
    34. // }
    35. //
    36. //void p() {
    37. // for (int i = 1; i <= n; i++) {
    38. // for (int j = 1; j <= m; j++) {
    39. // cout << mp[i][j];
    40. // }
    41. // cout << endl;
    42. // }
    43. //}

    实验后发现可以遵循这种规律来填数,故直接周期填数 

    1. /* memset(can, sizeof(can), true);
    2. cin >> n >> m;
    3. beg(1, 1);
    4. p();
    5. */
    6. cin >> n >> m;
    7. string str[3] = { "RGB","BRG","GBR" };
    8. for (int i = 1; i <= n; i++) {
    9. for (int j = 1; j <= m; j++) {
    10. cout << str[i % 3 ][j % 3 ];
    11. }
    12. cout << endl;
    13. }

    D题

    没啥好说 

    1. cin >> n >> sum;
    2. for (int i = 1; i <= n; i++) {
    3. cin >> n1 >> n2;
    4. sum = min(max(sum / n1, 0), max(sum - n2, 0));
    5. }
    6. cout << sum;

    E题 

    1. int n, num, count2 = 0, count4 = 0, countc[4] = { 0,0,0,0 };
    2. char color;
    3. bool flag = false, flag2 = true;
    4. cin >> n;
    5. for (int i = 1; i <= n; i++) {
    6. cin >> num;
    7. if (num == 2) {
    8. if (flag||count2>=8) { flag2 = false; break; }
    9. count2++;
    10. cin >> color;
    11. if(color=='R'){
    12. if (countc[0] >= 2) {
    13. flag2 = false;
    14. break;
    15. }
    16. countc[0]++;
    17. }
    18. if (color == 'Y') {
    19. if (countc[1] >= 2) {
    20. flag2 = false;
    21. break;
    22. }
    23. countc[1]++;
    24. }
    25. if (color == 'B') {
    26. if (countc[2] >= 2) {
    27. flag2 = false;
    28. break;
    29. }
    30. countc[2]++;
    31. }
    32. if (color == 'G') {
    33. if (countc[3] >= 2) {
    34. flag2 = false;
    35. break;
    36. }
    37. countc[3]++;
    38. }
    39. }if (num == 4) {
    40. if (count4 >= 4) {
    41. flag2 = false;
    42. break;
    43. }
    44. count4++;
    45. flag = true;
    46. }
    47. }
    48. if (!flag2) { cout << "No"; }
    49. else {
    50. cout << "Yes";
    51. }
    1. int cnt = 0;
    2. cin >> n >> m;
    3. for (int i = 1; i <= n; i++) {
    4. //for (int j = 1; j <= m; j++) {
    5. cin >> arr[i];
    6. //}
    7. }
    8. int beginn, beginm, sum, num;
    9. bool flag = false;
    10. cin >> beginn >> beginm >> sum >> num;
    11. int one;
    12. bool start = true;
    13. for (int i = beginn; i <= n; i++) {
    14. for (int j = 0; j <= m - 1; j++) {
    15. if (start) { j = beginm - 1; start = false; }
    16. if (!flag) {
    17. if ((arr[i][j]-'0') == 0) {
    18. continue;
    19. }
    20. else {
    21. one = (arr[i][j] - '0');
    22. flag = true;
    23. }
    24. }
    25. else {
    26. if (one * 10 + (arr[i][j]-'0') > sum) {
    27. cout << one << " ";
    28. cnt++;
    29. flag = false;
    30. if (cnt == num) {
    31. break;
    32. }
    33. if ((arr[i][j] - '0') == 0) {
    34. continue;
    35. }
    36. else {
    37. one = (arr[i][j] - '0');
    38. flag = true;
    39. }
    40. }
    41. else {
    42. one = one * 10 + (arr[i][j ] - '0');
    43. }
    44. }
    45. }
    46. }
    1. int n, m;
    2. string arr[1005];
    3. int beginn, beginm, sum, num2;
    4. bool fi[100];
    5. int cnt = 0;
    6. queue<int>q;
    7. void check(int num) {
    8. if (num > num2 || fi[num] || num == 0) {
    9. return;
    10. }
    11. else {
    12. //cout << num<<" ";
    13. q.push(num);
    14. fi[num] = true;
    15. cnt++;
    16. }
    17. }
    18. cin >> n >> m;
    19. for (int i = 1; i <= n; i++) {
    20. cin >> arr[i];
    21. }
    22. cin >> beginn >> beginm >> num2 >>sum;
    23. if (sum > num2) {
    24. cout << -1;
    25. return 0;
    26. }
    27. int one;
    28. int j = beginm-1,i=beginn;
    29. while (i <= n) {
    30. if (j == m - 2) {
    31. int temp1 = (arr[i][j] - '0') * 10;
    32. j++;
    33. int temp2 = (arr[i][j] - '0');
    34. one = temp1 + temp2;
    35. i++,j = 0;
    36. check(one);
    37. }
    38. else if (j == m - 1) {
    39. if (i == n) {
    40. break;
    41. }
    42. int temp1 = (arr[i][j] - '0') * 10;
    43. i++, j = 0;
    44. int temp2 = (arr[i][j] - '0');
    45. one = temp1 + temp2;
    46. j = 1;
    47. check(one);
    48. }
    49. else if(j<m-2) {
    50. int temp1 = (arr[i][j] - '0') * 10;
    51. j++;
    52. int temp2 = (arr[i][j] - '0');
    53. one = temp1 + temp2;
    54. j++;
    55. check(one);
    56. }
    57. if (cnt == sum) {
    58. break;
    59. }
    60. }
    61. if (cnt < sum) {
    62. cout << -1;
    63. }
    64. else {
    65. while (!q.empty()) {
    66. int cur = q.front();
    67. q.pop();
    68. cout << cur << " ";
    69. }
    70. }
    1. long long arr[100005];
    2. int n, num, op, x, v, cur, cnt, bianhao;
    3. long long zeng;
    4. long long sum;
    5. queue<long long>q;
    6. cin >> n;
    7. for (int i = 1; i <= n; i++) {
    8. cin >> arr[i];
    9. }
    10. cin >> num;
    11. for (int i = 1; i <= num; i++) {
    12. cin >> op;
    13. if (op == 1) {
    14. cin >> bianhao>>zeng;
    15. arr[bianhao] += zeng;
    16. }
    17. else if (op == 2) {
    18. cin >> cur;
    19. cnt = 1;
    20. sum = 0;
    21. while (1) {
    22. sum += arr[cur];
    23. arr[cur] = 0;
    24. if (cur + cnt > n) {
    25. break;
    26. }
    27. else {
    28. cur += cnt;
    29. cnt++;
    30. }
    31. }
    32. q.push(sum);
    33. }
    34. }
    35. while (!q.empty()) {
    36. long long t = q.front();
    37. q.pop();
    38. cout << t << endl;
    39. }
    1. int n;
    2. long long xi, yi;
    3. long double pk, px, py;
    4. bool valid = true;
    5. cin >> n;
    6. if (n <= 2) {
    7. cout << -1;
    8. }
    9. else {
    10. for (int i = 1; i <= n; i++) {
    11. cin >> xi >> yi;
    12. if (i == 1) { px = xi; py = yi; continue; }
    13. if (i == 2) { pk = (long double)(yi - py) /(long double) (xi - px); continue; }
    14. if ((yi - py) / (xi - px) != pk) {
    15. cout << "Parabola";
    16. valid = false;
    17. break;
    18. }
    19. }
    20. if (valid) {
    21. if (pk == 0) {
    22. cout << "Const";
    23. }
    24. else {
    25. cout << "Line";
    26. }
    27. }
    28. }
    1. #include<iostream>
    2. #include<stack>
    3. #include<string>
    4. using namespace std;
    5. int n;
    6. int main() {
    7. cin >> n;
    8. while (n--) {
    9. stack<int>s;
    10. string st;
    11. cin >> st;
    12. int i = 0;
    13. for (; i < st.length(); i++) {
    14. if (st[i] == '{') {
    15. if (!s.empty()) {
    16. if (s.top() == ')' || s.top() == ']' || s.top() == '>') {
    17. cout << "NO" << endl;
    18. break;
    19. }
    20. }
    21. s.push('}');
    22. }
    23. else if (st[i] == '(') {
    24. if (!s.empty()) {
    25. if (s.top() == '>') {
    26. cout << "NO" << endl;
    27. break;
    28. }
    29. }
    30. s.push(')');
    31. }
    32. else if (st[i] == '[') {
    33. if (!s.empty()) {
    34. if (s.top() == ')' || s.top() == '>') {
    35. cout << "NO" << endl;
    36. break;
    37. }
    38. }
    39. s.push(']');
    40. }
    41. else if (st[i] == '<') {
    42. s.push('>');
    43. }
    44. if (s.empty()) {
    45. cout << "NO" << endl;
    46. break;
    47. }
    48. else if (st[i] == s.top()) {
    49. s.pop();
    50. }
    51. }
    52. if (s.empty() && i == st.length()) {
    53. cout << "YES" << endl;
    54. }
    55. }
    56. }
    1. string s1;;
    2. stack<int>s;
    3. int sum, top = 0, num1, num2;
    4. getline(cin, s1);
    5. for (int i = 0; s1[i] != '#'; i++) {
    6. if (s1[i] >= '0' && s1[i] <= '9') {
    7. sum = s1[i] - '0';
    8. int j;
    9. for (j = i + 1; s1[i] != '#'; j++) {
    10. if (s1[j] >= '0' && s1[j] <= '9') {
    11. sum = sum * 10 + (s1[j] - '0');
    12. }
    13. else {
    14. break;
    15. }
    16. }
    17. if (i > 0 && s1[i - 1] == '-') {
    18. sum = -sum;
    19. }
    20. i = j - 1;
    21. s.push(sum);
    22. top++;
    23. }
    24. else if (s1[i]==' ') {
    25. continue;
    26. }
    27. else if (s1[i]=='-'&&s1[i+1]!=' ') {
    28. continue;
    29. }
    30. else {
    31. if (top < 2) {
    32. cout << "Expression Error: " << s.top() << endl;
    33. return 0;
    34. }
    35. num1 = s.top();
    36. s.pop();
    37. top--;
    38. num2 = s.top();
    39. s.pop();
    40. top--;
    41. switch (s1[i]) {
    42. case '+':
    43. s.push(num2 + num1);
    44. top++;
    45. break;
    46. case '-':
    47. s.push(num2 - num1);
    48. top++;
    49. break;
    50. case '*':
    51. s.push(num2 * num1);
    52. top++;
    53. break;
    54. case '/':
    55. if (num1 == 0) {
    56. cout << "Error: " << num2 << "/0" << endl;
    57. return 0;
    58. }
    59. s.push(num2 / num1);
    60. top++;
    61. break;
    62. }
    63. }
    64. }
    65. if (top != 1) {
    66. cout << "Expression Error: " << s.top() << endl;
    67. }
    68. else {
    69. cout << s.top() << endl;
    70. }
    1. int n;
    2. long long k;
    3. string t;
    4. vector<char>words;
    5. void swap(int a, int b) {
    6. char temp = t[a];
    7. t[a] = t[b];
    8. t[b] = temp;
    9. }
    10. cin >> n >> k;
    11. cin >> t;
    12. //cout << t << endl;
    13. int len = 0;
    14. for (int i = 0; i < 4 * n; i++) {
    15. if (t[i] == '0') {
    16. len++;
    17. }
    18. if (t[i] == '1') {
    19. if (k <= len) {
    20. swap(i, i - k);//i是当前的位置,k是能支撑交换的长度
    21. break;
    22. }
    23. else {
    24. swap(i, i - len);
    25. k -= len;
    26. }
    27. }
    28. }
    29. //cout << t << endl;
    30. for (int i = 0; i < 4 * n; i=i+4) {
    31. int temp = 0;
    32. for (int j = 3; j >= 0; j--) {
    33. temp += (t[i + j]-'0') * pow(2, 3 - j);
    34. }
    35. words.push_back('A'+temp);
    36. }
    37. //就是说直接在原来的01序列上,让第一个1不断往前移,一直积累,直到用完k次
    38. //如果从头开始遍历,遇到0,就积累进步长,遇到1,就是后续的第一个1,就要消耗k来进行移动
    39. //此时这个1前的0数量就是已经积累的步长,如果k大于,就让k减去,并能让这个1移到前面
    40. //如果小于,则只能移一点,并且终止
    41. for (int i = 0; i < words.size(); i++) {
    42. cout << words[i];
    43. }
    1. #include<stdio.h>
    2. #include<iostream>
    3. #include<string>
    4. #include<stack>
    5. #include<vector>
    6. #include<cmath>
    7. #include<queue>
    8. using namespace std;
    9. int n, m;
    10. int t,mod=1e9+7;
    11. const int N = 1e3;
    12. int c[N][N], dp[N][N];
    13. //s中的每个元素是一组A的集合,这个A的集合满足里面集合的元素是连续子集的关系
    14. //m是说s里的每个元素所包含的A的数量,衡量s里的每个元素
    15. //N是说每个A的大小
    16. //要连续M个A连续成子集,才能组成一个元素
    17. //一种极端是M个A都相等,
    18. //这里A指的是大A的子集
    19. //M指向下取连续子集的次数
    20. // 而且这种向下取是不可逆的,即这次取完后,剩下的都得在此基础上接着往下取,即此时母集就是这个
    21. // 递归,这一层从母集取的子集是下一层的母集
    22. // 如果母集有n个元素,那么子集的元素个数有0~n种情况
    23. // 每次取的情况都能唯一确定一个情况
    24. // 如果取n个,那就有1
    25. // n-1,有n种
    26. // 组合数
    27. // 如果取0个,那么后续都只能取0个,即此时后续都是空集
    28. // 在母集取,确定这层取的子集个数
    29. // 然后这层的子集个数是下层的母集个数
    30. // 如果让每层递归返回这层母集的所有情况数
    31. // 那么这层就是要让取的子集个数的情况数*对应个数的下一层母集的所有情况数
    32. // 最后加和
    33. //
    34. // 如n=2,m=1,只能向下取一次
    35. // 母集有2个,则子集可以取210
    36. //2个时有一种情况,取1个时有两种情况,取0个时有1种情况
    37. // 每次取完后都不再向下取,因为只能向下取一次,即递归层数为1
    38. // 直接加和,为4
    39. //
    40. // 如果n=1,m=100,能向下取100
    41. // 母集只有1个元素,则子集可以取10
    42. //1个时,一种情况,再向下
    43. //
    44. // //
    45. // 从头开始,即从空集开始,一串0,长度为n
    46. // 然后就每次对于为0的地方可以有,也可以没有
    47. // 如果选择有,就是0变成1,如果没有就依然保持0
    48. //
    49. //就是手里的n是一定的,然后一共可以操作m次
    50. //每次可以丢掉不大于当前手里数量的个数
    51. //问丢的所有情况数是多少
    52. //
    53. // 有两个参数,一个是当前剩的数量,一个是还剩下的操作次数
    54. // 应该让操作次数从0一直到m,即补全而不超过的思想
    55. // 每次可以选择补,也可以选择不补
    56. // 补的话,就是在和全部相比,剩下的那些数里选
    57. // 并且确定要补的个数,每次补的选择总数就是组合数
    58. //
    59. //
    60. //dpr,c记录剩这么多,且还有这么多次数时,一共可能的情况
    61. //dp[0][c]=0,如果是空集的话,不管剩几次,都是0
    62. int fc(int n,int up) {
    63. if (c[n][up]) {
    64. return c[n][up];
    65. }
    66. for (int i = 0; i <= n; i++) {
    67. c[i][1] = i % mod;
    68. c[i][i] = c[i][0] = 1;
    69. }
    70. for (int i = 2; i <= n; i++) {
    71. for (int j = 2; j < i; j++) {
    72. c[i][j] = (c[i - 1][j - 1] + c[i - 1][j]) % mod;
    73. }
    74. }
    75. return c[n][up];
    76. }
    77. int fdp(int r, int cn) {//r是说当前剩余,c是说还剩下的操作次数
    78. if (dp[r][cn]) {
    79. return dp[r][cn];
    80. }
    81. if (cn == 0) {//没有时,即最后一个元素里的最后A
    82. dp[r][cn] = 1;
    83. return dp[r][cn];
    84. }
    85. else {
    86. for (int i = 0; i <= r; i++) {//i是说下层母集的长数,从原母集中丢掉了r-i个元素,要选择
    87. //前者是说选完后的子集是下一层的母集,并由此确定的后续情况总数
    88. //后者是说在本次选的情况的总数
    89. dp[r][cn] += (fdp(i, cn - 1) * fc(r, r - i))%mod;
    90. }
    91. return dp[r][cn];
    92. }
    93. }
    94. int main() {
    95. cin >> t;
    96. while (t--) {
    97. cin >> n >> m;
    98. cout << fdp(n, m) << endl;
    99. }
    100. return 0;
    101. }

    每个十进制数都可以转换为二进制,也就是都可以用2的次幂组合得到

    1. int t;
    2. long long n, m, ans, base;
    3. long long mod = 1e9 + 7;
    4. long long quick(long long a, long long b) {//a的b次方
    5. //b是一个十进制数,把b转为二进制,然后组合
    6. //就是说a的不同b的独位上的数乘起来,保证每个独位上最多只有一个
    7. ans = 1;
    8. while (b > 0) {
    9. if (b & 1) {
    10. ans = ans * base % mod;
    11. }
    12. base = base * base % mod;
    13. b >>= 1;
    14. }
    15. return ans;
    16. }
    17. //第二个思路是递归,就是偶数时,就是x^p=x^(2*(p/2))
    18. //就是让底数自乘一下,底数变大了,指数缩小了一半
    19. //如果是奇数时,依然是自乘,指数缩小一半,但是最后算完还要再乘以个原底数
    20. cin >> t;
    21. while (t--) {
    22. cin >> n >> m;
    23. base = m + 1;
    24. cout <<quick(m+1, n) << endl;
    25. }
    1. struct node {
    2. int data;
    3. long long sum;
    4. double wait;
    5. int pre;
    6. double ex;
    7. bool have = false;
    8. }list[N];
    9. int n;
    10. long long sum1;
    11. void fuzhi(int i) {
    12. sum1 = 0;
    13. for (int j = 1; j <= n; j++) {
    14. if (j == i) { continue; }
    15. else if (list[j].pre == list[i].pre) {
    16. sum1 += list[j].sum;
    17. }
    18. }
    19. list[i].wait = (double)sum1 / 2.0 + list[list[i].pre].wait;
    20. list[i].ex = list[i].wait + (double)list[i].sum;
    21. list[i].have = true;
    22. //cout << list[i].sum << " " << list[i].wait << " " << " " << list[i].ex << endl;
    23. }
    24. cin >> n;
    25. list[1].pre = 0;
    26. list[1].have = true;
    27. for (int i = 1; i <= n; i++) {
    28. cin >> list[i].data;
    29. list[i].sum = list[i].data;
    30. }
    31. for (int i = 1; i <= n - 1; i++) {
    32. int f, b;
    33. cin >> f >> b;
    34. list[b].pre = f;
    35. int p = f;
    36. while (p != 0) {
    37. list[p].sum += list[b].data;
    38. p = list[p].pre;
    39. }
    40. }
    41. fuzhi(1);
    42. cout << fixed << setprecision(2) << list[1].ex << " ";
    43. for (int i = 2; i <= n; i++) {
    44. if (list[i].have) {
    45. printf("%.2lf ", list[i].ex);
    46. // cout << fixed << setprecision(2)<< list[i].ex << " ";
    47. continue;
    48. }
    49. stack<int>s;
    50. int temp = i;
    51. while (!list[list[i].pre].have) {
    52. s.push(i);
    53. i = list[i].pre;
    54. }
    55. fuzhi(i);
    56. while (!s.empty()) {
    57. int cur = s.top();
    58. s.pop();
    59. fuzhi(cur);
    60. }
    61. i = temp;
    62. printf("%.2lf ", list[i].ex);
    63. // cout << fixed << setprecision(2)<<list[i].ex << " ";
    64. }
    1. //void link(int x, int y) {//x是当前的结点,y是连接到这个结点的子节点
    2. // to[++m] = y;//x结点的第++m个孩子结点为y
    3. // next[m] = fi[x];//fi[x]是之前的m,就是这个新结点的前一个结点,或许可以称为新节点的前驱结点
    4. // fi[x] = m;//记录的不仅是数量,还是最后一个孩子的编号
    5. //}//是说每个结点都存着一个数组,这个数组把子节点串起来,且子节点满足兄弟关系
    6. 那么每个子节点的串的关系就用next来表述,子节点有子节点的编号,被串起来时,是父节点数组的编号,即m,
    7. 每个子节点

    应该写层序优先 

  • 相关阅读:
    Django模型层之如何开启事务、常见的字段类型和参数、ORM字段参数、关系字段
    C语言结构体讲解(通俗易懂)
    Linux(四)- Linux常用基本命令(帮助命令、文件目录类、搜索查找类、进程管理类)
    Maven常见面试题总结
    【云原生-Kurbernetes篇】HPA 与 Rancher管理工具
    采购数字化提升企业竞争壁垒,供应商系统助力冷链生鲜企业强化供应商管理能力
    基于springboot在线考试报名系统毕业设计源码031706
    学习永不止步!誉天9月开班计划来啦!
    YOLOv8改进 | SPPF | 双通道特征处理的池化结构——SPPFCSPC【全网独家】
    文举论金:黄金原油全面走势分析策略指导。
  • 原文地址:https://blog.csdn.net/m0_73553411/article/details/133466864