ACM:均分纸牌

[复制链接]
发表于 2025-12-12 11:09:06 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×


重要思绪


  • 团体思绪概述:

    • 本题旨在办理给定N堆纸牌(纸牌总数是N的倍数),通过按照特定移牌规则移动纸牌,找出用最少移动次数使每堆纸牌数目相称的方法。步调接纳了一种渐渐调解的思绪,先盘算出每堆纸牌应有的均匀数目,然后从第一堆开始依次查抄每堆纸牌数目与均匀值的差别,通过将差值累加到相邻堆上的方式举行调解,同时纪录调解次数,直至全部堆的纸牌数目都到达均匀值,输出最少移动次数。

  • 输入与数据预备部分:

    • 起首通过while循环不停读取输入的整数N(表现纸牌堆数),只要能乐成读取且N不为0,就进入当前测试案例的处理惩罚流程。在每个测试案例中,界说一个整数数组s用于存储每堆纸牌的初始数目,然后使用for循环依次读取每堆纸牌的初始数目,并累加到变量sum中,从而得到全部纸牌的总数。接着通过ave = sum / N;语句盘算出每堆纸牌终极应到达的均匀数目。

  • 核心调解逻辑部分:

    • 界说变量count并初始化为0,用于纪录调解纸牌堆使每堆纸牌数目到达均匀值的操纵次数。接着通过一个for循环遍历数组s,对每堆纸牌举行查抄和调解操纵。在循环中,假如当前堆的纸牌数目已经便是均匀值,阐明不必要对这堆纸牌举行调解操纵,直接通过continue语句跳过本次循环,继续查抄下一堆纸牌;若当前堆纸牌数目不便是均匀值,则将当前堆与均匀值的差值累加到下一堆纸牌上(s[i + 1] += s - ave;),以此模拟按照规则移动纸牌的操纵,使各堆纸牌数目渐渐趋近均匀值,每举行一次如许的调解操纵,就将调解次数count加1。

  • 输出结果部分:

    • 在完成对全部堆纸牌的一次遍历调解后,通过printf("%d\n", count);语句输出使全部堆纸牌数目到达相称时所必要的最少移动次数,完成当前测试案例的处理惩罚。然后继续回到while循环开头,等候下一次输入新的N值,继续处理惩罚下一个测试案例,直到输入的N为0时,步调竣事运行。

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int main()
  4. {
  5.     int N;  // 用于存储输入的纸牌堆数,控制循环及后续数组大小等相关操作
  6.     // 外层while循环,只要能成功读取到整数N且N不等于0,就进入当前测试案例的处理逻辑,当输入N为0时,循环结束,程序终止
  7.     while (scanf("%d", &N) && N != 0)
  8.     {
  9.         int s[100];  // 定义一个整数数组s,用于存储每堆纸牌的初始数量,数组大小设为100,可根据题目中N的范围限制(1 <= N <= 100)进行合理存储
  10.         int i, sum = 0, ave;  // i用于循环计数,sum用于累加所有纸牌堆的纸牌数量,ave用于存储每堆纸牌最终应达到的平均数量
  11.         // 循环读取每堆纸牌的初始数量,并累加到sum变量中,实现计算所有纸牌总数的功能
  12.         for (i = 0; i < N; i++)
  13.         {
  14.             scanf("%d", &s[i]);
  15.             sum += s[i];
  16.         }
  17.         ave = sum / N;  // 计算出所有纸牌平均分配到每堆时,每堆应有的纸牌数量
  18.         int count = 0;  // 用于记录调整纸牌堆使每堆纸牌数量达到平均值的操作次数,初始化为0
  19.         // 遍历数组s,对每堆纸牌进行检查和调整操作
  20.         for (i = 0; i < N; i++)
  21.         {
  22.             // 如果当前堆的纸牌数量已经等于平均值,说明不需要对这堆纸牌进行调整操作,直接跳过本次循环,继续检查下一堆纸牌
  23.             if (s[i] == ave)
  24.                 continue;
  25.             // 将当前堆与平均值的差值累加到下一堆纸牌上,实现纸牌的移动调整操作,使各堆纸牌数量逐步趋近平均值
  26.             s[i + 1] += s[i] - ave;
  27.             count++;  // 每进行一次这样的调整操作,调整次数count就加1
  28.         }
  29.         // 输出使所有堆纸牌数量达到相等时所需要的最少移动次数
  30.         printf("%d\n", count);
  31.     }
  32.     return 0;
  33. }
复制代码

回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表