#include<stdio.h>
int main()
{
int N;
scanf("%d",&N);
int a[N];
int total = 0;
for(int i = 0;i < N;i++)
{
scanf("%d",&a[i]);
total += a[i];
}
int average = total / N;//算出牌组的平均值
int result = 0;//移动牌的次数
for(int i = 0;i < N - 1;i++)
{
if(i == 0&&a[i] < average)//把a[0]变为平均值,处理后面的值时,就只考虑与其右边值交换
{
int temp = average - a[i];
a[i] += temp;
a[i + 1] -= temp;
result++;
}
else if(i == 0&&a[i] > average)
{
int temp = a[i] - average;
a[i] -= temp;
a[i + 1] += temp;
result++;
}
else if(a[i] < average)
{
int temp = average - a[i];
a[i] += temp;
a[i + 1] -= temp;
result++;
}
else if(a[i] > average)
{
int temp = a[i] - average;
a[i] -= temp;
a[i + 1] += temp;
result++;
}
}
printf("%d",result);
return 0;
}
``~~删除线格式~~ `
这道贪心题的思路是先将第一堆牌变成平均数,然后变化后面的时候,如果当前牌组的值高于平均值,就将当前牌组多余的牌移动到后面一个牌堆,如果当前牌堆的值小于平均值,就从下一个牌堆中抽牌,将当前牌堆的值补充到平均值。
依此处理到倒数第二堆牌时,所有牌组就都是平均值了,这道贪心题不需要排序,不需要考虑时间复杂度,是一道比较简单的贪心算法题。
~~删除线格式~~
溜了溜了~~
洛谷 P1031 均分纸牌 C语言
最新推荐文章于 2024-03-22 20:30:00 发布