洛谷歷險記 p1031 貪心算法

#include <iostream>
#include <algorithm>
#include <queue>

using namespace std;


int main() {
	int n;
	int a[10000];
	int ans = 0;
	int avg;
	int sum = 0;
	cin >> n;
	for (int i = 0; i < n; i++)
	{
		cin >> a[i];
		sum += a[i];
	}
	avg = sum / n;
	for (int i = 0; i < n; i++)
	{
		a[i] -= avg;
	}
	for (int i = 0; i < n-1; i++)
	{
		if (a[i] == 0) {
			continue;
		}
		else {
			a[i + 1] += a[i];
			ans++;
		}
	}

	cout << ans;
	
}

分析:

①由於題意,最左邊的牌堆只能從第二個牌堆取牌,所以由貪心思想,將第一個牌堆看作一個牌堆,後面剩餘的所有牌堆看作一個大牌堆,每次直接將第一個牌堆補至平均值。

②補至上限後,則不用管它了,把它分離出去,第二個牌堆成爲第一個牌堆,後面的所有牌堆成爲下一個大牌堆

③過程中會出現牌的數量小於0的情況下,即後面的牌堆的還欠着前面的帳。

深入分析:這是一種可逆思想,其實一直往後是求出該位置究竟要跟其後面的位置交換多少張牌

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