zoukankan      html  css  js  c++  java
  • 洛谷

    题意:给n堆石头,每相邻的两堆石头可以互换石头,现在问你最少要几次才能够,把每堆石头的个数都变为相同。

    思路:一开始,发现了相邻的石头交换多次肯定不如一次把所有前面需要的石头都加在一堆石头上,最后一次,直接把所有石头一次性加到前面的堆,这样大大减少了次数。但是没想到和前缀和有啥关系,所以就跑去想怎么交换石头的数量了,挺复杂。其实既然要满足最优方案,最多只交换一次,那么这样就看两堆石头换不换就可以了,何必去看啥石头数量啦,本质是交换次数吖。

    证明最优方案:相邻的石头交换多次肯定不如一次把所有前面需要的石头都加在一堆石头上,最后一次,直接把所有石头一次性加到前面的堆。

    #include<bits/stdc++.h>
    using namespace  std;
    
    int c[110],ave;
    int n;
    int  main()
    {
        scanf("%d",&n);
        int x;
        for(int i=1;i<=n;i++)
        {
            scanf("%d",&x);
            c[i]=c[i-1]+x;
        }
    
        ave=c[n]/n;
        int ans;
        ans=0;
        for(int i=1;i<=n;i++)
            if(ave*i!=c[i]) ans++;
    
        cout<<ans;
    
        return 0;
    }
  • 相关阅读:
    leetcode[68] Climbing Stairs
    leetcode[67] Plus One
    17_8_16 接口实例化的方法
    17_8_15 lambda 表达式
    17_8_14 回调函数
    17_8_11 Spring Jdbc+Dbcp
    17_8_10 eclipse 中复制网上代码 出现 报错 问题(0)
    17_8_10 PostgreSql Mac
    17_8_10 项目开发流程
    17_8_9 html 不常用的标签
  • 原文地址:https://www.cnblogs.com/rainyskywx/p/10960732.html
Copyright © 2011-2022 走看看