HH_Knight 2020-03-29 19:39 采纳率: 0%
浏览 96

新手求帮助,感谢各位大佬

有N堆石子,每堆石子有若干石头,所有石头的总数是N的倍数。

可以在任意一堆上取若干石头,进行移动。移动规则是:在第一堆上取的石子,只能移到第二堆;在第N堆上取的石子,只能移到N-1堆;其他堆上取的,可以移到相邻左边或者右边。如何用最少的移动次数使得每堆石子的数量一样多呢?

当N=4时,4堆石子数为:9、8、17、6

移动3次可以使4堆数目一样多:

从第3堆取4个石子放到第4堆(9、8、13、10)

从第3堆取3个放到第2堆(9、11、10、10)

从第2堆取1个放到第1堆(10、10、10、10)

输入格式:
第一行包含一个整数N(1<= N <=100),表示有N堆石子;

接着有N行,每行一个整数ai(1<= ai <=10000),表示第i堆石子的数量。

输出格式:
输出一个整数,表示使所有石子堆的石子均达到相等时需要的最少移动次数。

输入样例:
4
9 8 17 6

输出样例:
3

  • 写回答

1条回答 默认 最新

  • 你知我知皆知 2024-07-25 16:45
    关注

    以下回答参考 皆我百晓生券券喵儿 等免费微信小程序相关内容作答,并由本人整理回复。

    #include <iostream>
    using namespace std;
    #define MAX 1005
    int n, cnt[MAX], a[MAX];
    void solve() {
        int ans = 0;
        for (int i = 1; i <= n; ++i) {
            if (cnt[i] > 0)
                ans += min(cnt[i], cnt[n - i + 1]);
        }
        cout << ans << endl;
    }
    int main() {
        cin >> n;
        for (int i = 1; i <= n; ++i) cin >> a[i];
        for (int i = 1; i <= n; ++i) {
            cnt[a[i]]++;
            if (a[i] != 1 && a[i] != n) cnt[a[i] - 1]++;
            if (a[i] != n && a[i] != n - 1) cnt[a[i] + 1]++;
        }
        solve();
        return 0;
    }
    
    评论

报告相同问题?

悬赏问题

  • ¥15 如何用数码管显示学号(相关搜索:单片机)
  • ¥15 错误于library(org.Hs.eg.db): 不存在叫‘org.Hs.eg.db’这个名称的程序包,如何解决?
  • ¥60 求一个图片处理程序,要求将图像大小跟现实生活中的大小按比例联系起来的
  • ¥50 求一位精通京东相关开发的专家
  • ¥100 求懂行的大ge给小di解答下!
  • ¥15 pcl运行在qt msvc2019环境运行效率低于visual studio 2019
  • ¥15 MAUI,Zxing扫码,华为手机没反应。可提高悬赏
  • ¥15 python运行报错 ModuleNotFoundError: No module named 'torch'
  • ¥100 华为手机私有App后台保活
  • ¥15 sqlserver中加密的密码字段查询问题