算法提高 盾神與積木遊戲

算法提高 盾神與積木遊戲

最近的m天盾神都去幼兒園陪小朋友們玩去了~

每個小朋友都拿到了一些積木,他們各自需要不同數量的積木來拼一些他們想要的東西。但是有的小朋友拿得多,有的小朋友拿得少,有些小朋友需要拿到其他 小朋友的積木才能完成他的大作。如果某個小朋友完成了他的作品,那麼他就會把自己的作品推倒,而無私地把他的所有積木都奉獻出來;但是,如果他還沒有完成 自己的作品,他是不會把積木讓出去的喲~

盾神看到這麼和諧的小朋友們感到非常開心,於是想幫助他們所有人都完成他們各自的作品。盾神現在在想,這個理想有沒有可能實現呢?於是把這個問題交給了他最信賴的你。

輸入格式:

第一行爲一個數m。
接下來有m組數據。每一組的第一行爲n,表示這天有n個小朋友。接下來的n行每行兩個數,分別表示他現在擁有的積木數和他一共需要的積木數。

輸出格式:

輸出m行,如果第i天能順利完成所有作品,輸出YES,否則輸出NO。

輸入樣例:

在這裏給出一組輸入。例如:

2
2
2 2
1 3
3
1 5
3 3
0 4

輸出樣例:

在這裏給出相應的輸出。例如:

YES
NO

思路:

這道題可以用結構體來做,結構體中有own(擁有的積木數),need(需要的總積木數),lack(缺少的積木數)。輸入n個小朋友的數據後,把這n個小朋友按lack從小到大排序,然後循環着n個小朋友,當lack小於等於0時,sum+=lack,lack大於0時,如果sum>=lack,即該小朋友能夠完成積木,否則不能完成。

代碼:

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
struct jimu
{
	int own,need,lack;//擁有積木數、需要積木數、缺少積木數
};
bool cmp(jimu a, jimu b)//按缺少積木從多到少排序
{
	return a.lack < b.lack;
}
int main()
{
	int m, n,sum=0,flag=0;
	cin >> m;
	for (int i = 0; i < m; i++)
	{
		flag = 0; sum = 0;
		cin >> n;
		vector<jimu>arr(n);
		for (int i = 0; i < n; i++)
		{
			cin >> arr[i].own >> arr[i].need;
			arr[i].lack = arr[i].need - arr[i].own;
		}
		sort(arr.begin(), arr.end(), cmp);//排序
		for (int i = 0; i < n; i++)
		{
			if (arr[i].lack <= 0)//當前小朋友開始就有足夠的積木
				sum += arr[i].own;
			else
			{
				if (sum >= arr[i].lack)
					sum += arr[i].own;
				else//不能完成
				{
					flag = 1;
					break;
				}
			}
		}
		if (flag == 1)
			cout << "NO" << endl;
		else
			cout << "YES" << endl;
	}
    return 0;
}
發佈了55 篇原創文章 · 獲贊 8 · 訪問量 3978
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章