• P1031 [NOIP2002 提高组] 均分纸牌 【贪心】


    P1031 [NOIP2002 提高组] 均分纸牌 【贪心】
    题目描述
    有 N 堆纸牌,编号分别为 1,2,…,N。每堆上有若干张,但纸牌总数必为 N 的倍数。可以在任一堆上取若干张纸牌,然后移动。
    移牌规则为:在编号为 1 堆上取的纸牌,只能移到编号为 2 的堆上;在编号为 N 的堆上取的纸牌,只能移到编号为 N−1 的堆上;其他堆上取的纸牌,可以移到相邻左边或右边的堆上。
    现在要求找出一种移动方法,用最少的移动次数使每堆上纸牌数都一样多。
    例如 N=4 时,4 堆纸牌数分别为 9,8,17,6。
    移动 3 次可达到目的:
    从第三堆取 4 张牌放到第四堆,此时每堆纸牌数分别为 9,8,13,10。
    从第三堆取 3 张牌放到第二堆,此时每堆纸牌数分别为 9,11,10,10。
    从第二堆取 1 张牌放到第一堆,此时每堆纸牌数分别为 10,10,10,10。
    输入格式
    第一行共一个整数 N,表示纸牌堆数。
    第二行共 N 个整数 A1,A2,…,AN ,表示每堆纸牌初始时的纸牌数。
    输出格式
    共一行,即所有堆均达到相等时的最少移动次数。
    输入输出样例
    输入 #1
    4
    9 8 17 6
    输出 #1
    3
    说明/提示
    对于 100% 的数据,1≤N≤100,1≤Ai ≤10000。
    【题目来源】
    NOIP 2002 提高组第一题

    贪心思想解决思路:

    • 先计算出平均数,然后贪心地取一次调整好一堆。
    • 先摆平第1堆,向第2 堆多退少补,再摆平第 2 堆,向第 3 堆多退少补,如果第i堆已经摆平,则跳过。
    1. #include
    2. using namespace std;
    3. const int N=105;
    4. int n,a[N];
    5. int main()
    6. {
    7. cin>>n;
    8. int sum=0,res=0;
    9. for(int i=1;i<=n;i++){
    10. cin>>a[i];
    11. sum+=a[i];
    12. }
    13. sum/=n;
    14. for(int i=1;i<=n;i++){
    15. if(a[i]-sum>0){
    16. a[i+1]+=a[i]-sum;
    17. res++;
    18. }
    19. else if(a[i]-sum<0){
    20. a[i+1]+=a[i]-sum;
    21. res++;
    22. }
    23. }
    24. cout<
    25. return 0;
    26. }
  • 相关阅读:
    Java11改进的垃圾回收器
    搭建Redis主从复制、哨兵模式
    Python_数据容器(序列)的切片
    C++类和对象【中】
    音视频(1) - FFmpeg4.3.4编译
    享元模式
    基础知识:HTTP协议以及GET请求和POST请求的区别
    基于Python实现的SVM实验
    SpringBoot(一)快速入门
    警告-Ubuntu提示W: Possible missing firmware xxx解决方法
  • 原文地址:https://blog.csdn.net/lybc2019/article/details/133350436