【codevs1098 均分紙牌】貪心

#include <cstdio>
#include <algorithm>
using namespace std;

int a[105];

int main()
{
    int n, sum(0), ans(0);
    scanf("%d", &n);

    for (int i = 1; i <= n; i++)
    {
        scanf("%d", &a[i]);
        sum += a[i];
    }

    sum /= n;

    for (int i = 1; i <= n; i++)
    {
        a[i] -= sum;
    }

    int i = 1, j = n;
    while (a[i] == 0 && i < j) i++;

    while (i < j)
    {
        a[i + 1] += a[i];
        a[i] = 0;
        ans++;
        i++;

        while(a[i] == 0 && i < j) i++;
    }

    printf("%d\n", ans);
    return 0;
}

沒讀題系列。。。。。一開始沒看見它只能移到相鄰的上,然後寫了個排序之後最大的和最小的互補然後遞推的程序。。。。段錯誤。。。。

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
using namespace std;

int a[105], ans(0);
bool flag = false;

void fen(int n, int pre, int t)
{
    while (n > 0)
    {
        sort(a, a + n);

        for (int i = n; i >= n / 2 + 1; i--)
        {
            if (a[i] != a[n - i + 1])
            {
                a[i] -= (a[i] - pre);
                a[n - i + 1] += (a[i] - pre);
                ans++;
            }
        }

        for (int i = 1; i <= n; i++)
        {
            if (a[i] == pre)
            {
                a[i] = -1;
                n--;
            }
        }
        fen(n, pre, t+1);
    }
}

int main()
{
    int n, sum(0);
    scanf("%d", &n);

    for (int i = 1; i <= n; i++)
    {
        scanf("%d", &a[i]);
        sum += a[i];
    }

    double pre = sum / n;

    fen(n, pre, 1);

    printf("%d\n", ans);
    return 0;
}

我把代碼貼這。。。。求幫debug。。。。。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章