• 头歌-贪心算法


    第1关 

    找零钱

    任务描述

    本关任务:设计一个贪婪算法,使得找的钱币张数最少。

    商店售货员找给 1 个顾客 n 元,用以下七种面值的纸币:100 元,50 元,20 元,10 元,5 元,2 元,1 元。

    思考:如果商店售货员找给 1 个顾客 140 元,假设钱币的面值有九种:100 元,70 元,50 元,20 元,10 元,7 元,5 元,2 元,1 元。用贪婪算法得到的是该问题的最优解吗?

    编程要求

    请在右侧编辑器Begin-End处补充代码,完成本关任务,注意需要学生自己获取找的钱 n。

    测试说明

    平台会对你编写的代码进行测试,比对你输出的数值与实际正确数值,只有所有数据全部计算正确才能通过测试:

    测试输入:123(需要找给顾客的钱 n元)

    预期输出:

    1. #include
    2. int greedy_coin_change(int amount) {
    3. // 定义面值数组和对应的纸币名称
    4. int coins[] = {100, 50, 20, 10, 5, 2, 1};
    5. const char *coin_names[] = {"100元", "50元", "20元", "10元", "5元", "2元", "1元"};
    6. // 初始化计数器
    7. int count = 0;
    8. // 计算找零
    9. for (int i = 0; i < sizeof(coins) / sizeof(coins[0]); i++) {
    10. // 计算当前面值的纸币张数
    11. int num_coins = amount / coins[i];
    12. // 输出当前面值纸币的张数和名称
    13. printf("%s %d张\n", coin_names[i], num_coins);
    14. // 更新剩余的金额
    15. amount %= coins[i];
    16. }
    17. return count;
    18. }
    19. int main() {
    20. // 获取需要找给顾客的钱
    21. int n;
    22. scanf("%d", &n);
    23. // 调用贪婪算法计算最少需要的钱币张数
    24. int result = greedy_coin_change(n);
    25. // 输出结果
    26. return 0;
    27. }

    第2关:求一个数列的极差

    本关任务:将 n 个正整数作成的一个数列,进行如下操作:每一次删除其中的两个数 a 和 b,然后在数列中加入一个数a×b+1,如此下去直至数列中剩下一个数。

    在所有按这种操作方式最后得到的数中,最大的记作 max,最小的记作 min,则该数列的极差定义为M=max-min,请你使用贪心算法设计编程输出他们的极差。

    编程要求

    请在右侧编辑器Begin-End处补充代码,完成本关任务(注意已经为你获取输入数据)。

    测试说明

    平台会对你编写的代码进行测试,比对你输出的数值与实际正确数值,只有所有数据全部计算正确才能通过测试:

    测试输入:

     
    
    1. 7 //输入7(n)个整数
    2. 3 //此行及以下为具体的每个数据
    3. 5
    4. 7
    5. 9
    6. 11
    7. 13
    8. 15

    预期输出:Max=max-min=2221298-2038489=182809

    1. #include
    2. /********* Begin **********/
    3. int s1,s2;
    4. void max2(int a[],int n)
    5. {
    6. int j;
    7. if(a[1]>=a[2])
    8. {
    9. s1=1;
    10. s2=2;
    11. }
    12. else
    13. {
    14. s1=2;
    15. s2=1;
    16. }
    17. for (j=3;j<=n;j++)
    18. {
    19. if(a[j]>a[s1])
    20. {
    21. s2=s1;
    22. s1=j;
    23. }
    24. else if(a[j]>a[s2])
    25. s2=j;
    26. }
    27. }
    28. int calculatemin(int a[],int n)
    29. {
    30. while (n>2)
    31. {
    32. max2(a,n);
    33. a[s1]= a[s1]* a[s2]+1;
    34. a[s2]=a[n];
    35. n=n-1;
    36. }
    37. return(a[1]* a[2]+1);
    38. }
    39. void min2(int a[ ],int n)
    40. {
    41. int j;
    42. if(a[1]<=a[2])
    43. {
    44. s1=1;
    45. s2=2;
    46. }
    47. else
    48. {
    49. s1=2;
    50. s2=1;
    51. }
    52. for (j=3;j<=n;j++)
    53. {
    54. if (a[j]
    55. {
    56. s2=s1;
    57. s1=j;
    58. }
    59. else if (a[j]
    60. s2=j;
    61. }
    62. }
    63. int calculatemax(int a[],int n)
    64. {
    65. while (n>2)
    66. {
    67. min2(a,n);
    68. a[s1]= a[s1]* a[s2]+1;
    69. a[s2]=a[n];
    70. n=n-1;
    71. }
    72. return(a[1]* a[2]+1);
    73. }
    74. int length(int a[])
    75. {
    76. int i=1;
    77. while(a[i]!=0)
    78. {
    79. i++;
    80. }
    81. return i-1;
    82. }
    83. int main()
    84. {
    85. int i,n,b[100],max,min,num;
    86. scanf("%d",&num);
    87. int a[num+1];
    88. for (i=1;i<=num;i++)
    89. scanf("%d",&a[i]);
    90. for (i=1;i<=num;i++)
    91. b[i]=a[i];
    92. min= calculatemin(a,num);
    93. max= calculatemax(b,num);
    94. printf("Max=max-min=%d-%d=%d\n",max,min,max-min);
    95. }
    96. /********* End **********/

    第3关:将真分数用埃及分数之和表示

    任务描述

    本关任务:设计一个算法,把一个真分数 F 表示为埃及分数之和的形式。

    编程要求

    请在右侧编辑器Begin-End处补充代码,完成本关任务,注意需要学生自己获取真分数再进行编程。

    测试说明

    平台会对你编写的代码进行测试,比对你输出的数值与实际正确数值,只有所有数据全部计算正确才能通过测试:

    测试输入:3 5(3为分子,5为分母,真分数为3/5)

    预期输出:3/5=1/2+1/10

    1. #include "stdio.h"
    2. void main()
    3. {
    4. /********** Begin **********/
    5. int a,b,c;
    6. scanf("%d %d",&a,&b);
    7. if(a>=b)
    8. printf("输入错误");
    9. else
    10. if(a==1 || b%a==0)
    11. {
    12. printf("%d/%d=1/%d",a,b,b/a);
    13. }
    14. else
    15. {
    16. printf("%d/%d=",a,b);
    17. while(a!=1)
    18. {
    19. c = b/a+1;
    20. a = a*c - b;
    21. b = b*c;
    22. printf("1/%d",c);
    23. if(a>=1)
    24. printf("+");
    25. if(b%a ==0 || a==1)
    26. {
    27. printf("1/%d",b/a);
    28. a=1;
    29. }
    30. }
    31. }
    32. printf("\n");
    33. /********** End **********/
    34. }

    第4关:找到出现次数最多的数

    任务描述

    本关任务:给定 n 个正整数,编写一个实验程序找出它们中出现次数最多的数。如果这样的数有多个,输出其中最小的一个。

    编程要求

    请在右侧编辑器Begin-End处补充代码,完成本关任务。

    测试说明

    平台会对你编写的代码进行测试,比对你输出的数值与实际正确数值,只有所有数据全部计算正确才能通过测试:

    测试输入:

     
    
    1. 6 //给定6(n)个正整数
    2. 10 //此行及以下为具体的每个数据
    3. 1
    4. 10
    5. 20
    6. 30
    7. 20

    预期输出:出现次数最多的且最小的数为10

    1. #include
    2. using namespace std;
    3. #include
    4. /********** Begin **********/
    5. int find(int n,int * a)
    6. {
    7. int maxn=0,bestd,num=1,i=1;
    8. sort(a,a+n);
    9. int pred=a[0];
    10. while(i
    11. {
    12. while(i
    13. {
    14. num++;
    15. i++;
    16. }
    17. if(num>maxn)
    18. {
    19. bestd=pred;
    20. maxn=num;
    21. }
    22. pred=a[i];
    23. num=1;
    24. i++;
    25. }
    26. return bestd;
    27. }
    28. int main()
    29. {
    30. int n,bestd,i;
    31. scanf("%d",&n);
    32. int a[n];
    33. for(i=0;i
    34. scanf("%d",&a[i]);
    35. bestd=find(n,a);
    36. printf("出现次数最多的且最小的数为%d\n",bestd);
    37. return 0;
    38. }
    39. /********** End **********/

    第5关:将给定的整数去掉任意个数字后重新组成最小整数

    任务描述

    本关任务:键盘输入一个高精度的正整数 n,去掉其中任意 s 个数字后剩下的数字按原左右次序将组成一个新的正整数。

    编程对给定的 n 和 s,寻找一种方案使得剩下的数字组成的新数最小。

    编程要求

    请在右侧编辑器Begin-End处补充代码,完成本关任务。

    测试说明

    平台会对你编写的代码进行测试,比对你输出的数值与实际正确数值,只有所有数据全部计算正确才能通过测试:

    测试输入:

     
    
    1. 231183 //正整数n
    2. 3 //去掉3(s)个数字

    预期输出:113

    1. #include
    2. using namespace std;
    3. int main() {
    4. /********* Begin ********/
    5. int k;
    6. string s;
    7. cin >> s >> k;
    8. if (k > s.size()) {
    9. cout << "Invalid Input.";
    10. }
    11. while (k) {
    12. int i;
    13. for (i = 0; i < s.size() - 1 && s[i] <= s[i + 1]; i++);
    14. s.erase(i, 1);
    15. k--;
    16. }
    17. if (s.empty()) {
    18. cout << 0 << endl;
    19. }
    20. int i = 0;
    21. for (i = 0; i < s.size()-1;) {
    22. if (s[i] == '0') i++;
    23. else break;
    24. }
    25. cout << s.substr(i);
    26. return 0;
    27. /********* End ********/
    28. }

  • 相关阅读:
    Django--orm 多表外键字段的操作
    Springboot毕设项目绿色生鲜5954z(java+VUE+Mybatis+Maven+Mysql)
    基于数字孪生的智慧城市是如何发展的?
    SD-Branch多分支组网解决方案
    本地事务与分布式事务
    基于DQN的强化学习 快速浏览(基础知识+示例代码)
    银行面试加密算法之DES算法
    2023-09-10力扣每日一题
    webpack proxy如何解决跨域?
    改造el-dropdown ,实现多选效果,且当选项只剩下一个时,不允许取消
  • 原文地址:https://blog.csdn.net/SXXYNHHXX/article/details/136718930