• 洛谷


    题意:给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;
    }
  • 相关阅读:
    nopCommerce中缓存学习
    EF
    路由
    webapi的加密方式
    生成N位数字随机数
    C# DataTable 转 实体类
    WebBrowser 打印
    文件上传控件,格式统一
    sqlserver 表循环-游标、表变量、临时表
    VB 老旧版本维护系列---迷之集合- dataTable
  • 原文地址:https://www.cnblogs.com/rainyskywx/p/10960732.html
Copyright © 2020-2023  润新知