• 作业比赛编号 : 1280 - 2022年春季学期《算法分析与设计》练习15


    又一道简单题

    题目描述

    输入一个四个数字组成的整数 n,你的任务是数一数有多少种方法,恰好修改一个数字,把它 变成一个完全平方数(不能把首位修改成 0)。比如 n=7844,有两种方法:3844=622 和 7744=882。 

    输入

    输入第一行为整数 T (1<=T<=1000),即测试数据的组数,以后每行包含一个整数 n (1000<=n<=9999)。 

    输出

    对于每组数据,输出恰好修改一个数字,把 n变成完全平方数的方案数

    样例输入 Copy

    2
    7844
    9121

    样例输出 Copy

    Case 1: 2
    Case 2: 0
    1. #include<algorithm>
    2. #include <math.h>
    3. #include<iostream>
    4. using namespace std;
    5. bool fun(int x)
    6. {
    7. int t = sqrt(x);
    8. if (t * t == x)
    9. {
    10. return true;
    11. }
    12. else {
    13. return false;
    14. }
    15. }
    16. int main()
    17. {
    18. int T, n;
    19. cin >> T;
    20. for (int i = 1; i <= T; i++)
    21. {
    22. cin >> n;
    23. int count = 0;
    24. int a = 10, b = 1, temp;
    25. for (int j = 1; j <= 4; j++)
    26. {
    27. int k = (n % a) / b;
    28. temp = n - k * b;
    29. for (int c = 0; c <= 9; c++)
    30. {
    31. if (!(c == 0 && j == 4) && (c != k))
    32. if (fun(temp + c * b))
    33. ++count;
    34. }
    35. a = a * 10; b = b * 10;
    36. }
    37. cout << "Case" << " " << i << ":" << " ";
    38. cout << count << endl;
    39. }
    40. }

    自守数

    题目描述

    自守数是指一个数的平方的尾数等于该数自身的自然数。例如:25^2 = 625,76^2 = 5776,9376^2 = 87909376。请求出n以内的自守数的个数。

    输入

    int型整数。

    输出

    n以内自守数的数量。

    样例输入 Copy

    2000

    样例输出 Copy

    8
    1. #include<algorithm>
    2. #include<math.h>
    3. #include<iostream>
    4. using namespace std;
    5. int fun(int num)
    6. {
    7. int c = 0;
    8. while (num)
    9. {
    10. num /= 10;
    11. c++;
    12. }
    13. return c;
    14. }
    15. int main() {
    16. int n;
    17. while (cin >> n)
    18. {
    19. if (n >= 100000000)
    20. cout << 16 << endl;
    21. else
    22. {
    23. int ans = 0;
    24. for (int i = 0; i <= n; i++)
    25. {
    26. int cnt = fun(i);
    27. int m = pow(10, cnt);
    28. long long mul = (long long)i * (long long)i;
    29. if (mul % m == i)
    30. {
    31. ans++;
    32. }
    33. }
    34. cout << ans << endl;
    35. }
    36. }
    37. return 0;
    38. }

    相聚HNUCM校园食堂

    题目描述

    HNUCM的食堂重新装修了,小明决定约上朋友去食堂相聚,在食堂里,小明看到了M位男同学,N位女同学,小明是一个颜值控,因此他对每一位男生和女生都有一个颜值打分,他心里yy着想为这些单身狗们进行配对,小明真是一个关心同学的人!但小明认为配对同学的颜值之差不能超过5,注意必须是一位男同学和一位女同学才能配对,虽然小明对于可以配对的人数已经有了答案,但他想考考你的编程能力,因此他想请你帮他用编程算一下最多可以配对多少个人。(本题介绍仅作题目背景使用,无任何其他观点)

    输入

    每个测试文件仅有一条测试数据。
    第一行输入M,N,分别表示男同学的数量,女同学的数量。(1<=M<=100,1<=N<=100)
    第二行输入M个正整数,分别表示男同学们的颜值。
    第三行输入N个正整数,分别表示女同学们的颜值。
    注意,所有人的颜值分数范围在[1,100]

    输出

    输出最多可以配对的总人数。

    样例输入 Copy

    5 4
    10 65 23 67 80
    5 15 60 90

    样例输出 Copy

    4

    提示

    样例中第一位男同学和第一位女同学配对,第二位男同学和第三位女同学配对。

    1. #include<iostream>
    2. #include<algorithm>
    3. using namespace std;
    4. struct stu
    5. {
    6. int temp;
    7. int id;
    8. }a[10005], b[10005];
    9. int cmp(stu a, stu b)
    10. {
    11. return a.temp < b.temp;
    12. }
    13. int main()
    14. {
    15. int n, m;
    16. while (~scanf("%d %d", &n, &m))
    17. {
    18. for (int i = 0; i < n; i++)
    19. {
    20. scanf("%d", &a[i].temp);
    21. a[i].id = i;
    22. }
    23. for (int i = 0; i < m; i++)
    24. {
    25. scanf("%d", &b[i].temp);
    26. b[i].id = i;
    27. }
    28. sort(a, a + n, cmp);
    29. sort(b, b + m, cmp);
    30. int num = 0;
    31. for (int i = 0; i < n; i++)
    32. {
    33. for (int j = 0; j < m; j++)
    34. {
    35. if (abs(a[i].temp - b[j].temp) <= 5 && a[i].id != -1 && b[j].id != -1)
    36. {
    37. num++;
    38. a[i].id = -1;
    39. b[j].id = -1;
    40. continue;
    41. }
    42. }
    43. }
    44. printf("%d\n", num * 2);
    45. }
    46. return 0;
    47. }

    马的遍历问题 

    题目描述

    在5*4的棋盘中,马只能走斜“日”字。马从位置(x, y)处出发,把棋盘的每一格都走一次,且只走一次,请找出所有路径。

    输入

    x,y,表示马的初始位置。

    输出

    将每一格都走一次的路径总数,如果不存在该路径则输出“No solution!”。

    样例输入 Copy

    1 1
    2 2

    样例输出 Copy

    32
    No solution!

    1. #include <stdio.h>
    2. #include <stdlib.h>
    3. int A[200][200];
    4. int n = 5;
    5. int m = 4;
    6. int count = 0;
    7. int fx[8] = { 1,2,2,1,-1,-2,-2,-1 };
    8. int fy[8] = { 2,1,-1,-2,-2,-1,1,2 };
    9. int check(int x, int y) {
    10. if (x >= 1 && x <= n && y >= 1 && y <= m && A[x][y] == 0)
    11. return 1;
    12. else return 0;
    13. }
    14. void solve(int x, int y, int step) {
    15. int nextx;
    16. int nexty;
    17. A[x][y] = step;
    18. if (n * m == step) count++;
    19. for (int i = 0; i <= 7; i++)
    20. {
    21. nextx = x + fx[i];
    22. nexty = y + fy[i];
    23. if (check(nextx, nexty))
    24. solve(nextx, nexty, step + 1);
    25. }
    26. A[x][y] = 0;
    27. }
    28. int main() {
    29. int x;
    30. int y;
    31. while (~scanf("%d %d", &x, &y)) {
    32. solve(x, y, 1);
    33. if (count != 0)
    34. printf("%d", count);
    35. else {
    36. printf("No solution!");
    37. }
    38. printf("\n");
    39. count = 0;
    40. }
    41. return 0;
    42. }

    图的m着色问题

    题目描述

     给定无向连通图G和m种不同的颜色。用这些颜色为图G的各顶点着色,每个顶点着一种颜色。是否有一种着色法使G中每条边的2个顶点着不同颜色,请输出着色方案。

    输入

    输入第一行包含n,m,k分别代表n个结点,m条边,k种颜色,接下来m行每行有2个数u,v表示u和v之间有一条无向边,可能出现自环边,所以请忽略自环边。

    输出

    输出所有不同的着色方案,且按照字典序从小到大输出方案。

    样例输入 Copy

    3 3 3
    1 2
    1 3
    2 3
    

    样例输出 Copy

    1 2 3
    1 3 2
    2 1 3
    2 3 1
    3 1 2
    3 2 1
    1. #include<stdio.h>
    2. #include <stdlib.h>
    3. #include<math.h>
    4. int a[1000][1000];
    5. int color[1000];
    6. int check(int t, int i) {
    7. for (int j = 1; j < t; j++) {
    8. if (a[t][j] == 1 && color[j] == i)
    9. return 0;
    10. }
    11. return 1;
    12. }
    13. void solve(int t, int n, int k) {
    14. if (t > n) {
    15. for (int i = 1; i < n + 1; i++)
    16. printf("%d ", color[i]);
    17. printf("\n");
    18. }
    19. else {
    20. for (int i = 1; i <= k; i++) {
    21. if (check(t, i)) {
    22. color[t] = i;
    23. solve(t + 1, n, k);
    24. }
    25. }
    26. }
    27. }
    28. int main()
    29. {
    30. int n, m, k;
    31. while (~(scanf("%d%d%d", &n, &m, &k))) {
    32. for (int i = 0; i < n + 1; i++) {
    33. color[i] = 0;
    34. for (int j = 0; j < n + 1; j++)
    35. a[i][j] = 0;
    36. }
    37. int x, y;
    38. for (int i = 0; i < m; i++) {
    39. scanf("%d %d", &x, &y);
    40. a[x][y] = 1;
    41. a[y][x] = 1;
    42. }
    43. solve(1, n, k);
    44. }
    45. return 0;
    46. }

      素数环

    题目描述

    现有1,2,3...,n,要求用这些数组成一个环,使得相邻的两个整数之和均为素数,要求你求出这些可能的环。

    输入

    输入正整数n。

    输出

    输出时从整数1开始逆时针输出,同一个环只输出一次,且满足条件的环应按照字典序从小到大输出。
    注:每一个环都从1开始。

    样例输入 Copy

    6

    样例输出 Copy

    1 4 3 2 5 6
    1 6 5 2 3 4
    1. #include<stdio.h>
    2. #include <stdlib.h>
    3. #include<math.h>
    4. int a[20];
    5. int used[20];
    6. int sushu(int n) {
    7. for (int i = 2; i < n; i++) {
    8. if (n % i == 0) return 0;
    9. }
    10. return 1;
    11. }
    12. int check(int t, int i, int n) {
    13. if (used[i] || !sushu(i + a[t - 1])) {
    14. return 0;
    15. }
    16. else {
    17. if (t == n && !sushu(a[1] + i)) return 0;
    18. else
    19. return 1;
    20. }
    21. }
    22. void solve(int t, int n) {
    23. if (t > n) {
    24. for (int i = 1; i < n + 1; i++)
    25. printf("%d ", a[i]);
    26. printf("\n");
    27. return;
    28. }
    29. else {
    30. for (int i = 2; i <= n; i++) {
    31. if (check(t, i, n)) {
    32. used[i] = 1;
    33. a[t] = i;
    34. solve(t + 1, n);
    35. used[i] = 0;
    36. }
    37. }
    38. }
    39. }
    40. int main()
    41. {
    42. int n;
    43. while (~(scanf("%d", &n))) {
    44. for (int i = 1; i < n + 1; i++) {
    45. a[i] = 0;
    46. used[i] = 0;
    47. }
    48. a[1] = 1;
    49. used[1] = 1;
    50. solve(2, n);
    51. }
    52. return 0;
    53. }

  • 相关阅读:
    Unity进阶课程【一】Input Field 组件的失焦和使用
    NFS文件系统共享服务器实战
    Springboot快速开发-书本信息管理系统(项目源码)
    Java基础(一)——Hello World,8种数据类型,键盘录入
    JMeter添加插件
    Spring中什么样的Bean存在线程安全问题-有状态bean
    # [NOIP2011 提高组] 铺地毯
    地图还可以这么画_3D版
    苍穹外卖(一)
    雷卯推荐电磁兼容保护器件-PPTC自恢复保险丝
  • 原文地址:https://blog.csdn.net/weixin_51250562/article/details/125615945