1. 程式人生 > >京東2016筆試題,小東複習

京東2016筆試題,小東複習

問題描述:

臨近期末,讓小東頭疼的考試又即將到來了,而且是小東最不喜歡的科目,遺憾的事,
小東得知d天后他必須參加此次考試,小東的父親對他非常嚴格,要求他立即開始複習
功課。為照顧她的情緒,父親要求她每天該科目的學習時間在iminTime到imaxTime之間
,並計劃在考試前檢查小東是否按要求做了。若未能完成,小東將會受到懲罰。

現在小東的父親要求檢查小東的備考情況。遺憾的事,由於專注於備考,小東只是記錄
了自己備考的總時間sumTime,並沒有記錄每天覆習所用的時間,也不知道準備情況是否
符合父親的要求。他想知道是否能夠製作一個滿足需求的時間表以應付父親的檢查

輸入:
輸入中有多組測試資料。每組測試資料的第一行包含兩個整數d和sumTime,1<=d<=30,
0<=sumTime<=240,分別表示小東複習的天數及每天用於複習的時間之和。緊隨其後的d行
中,每行包括兩個空格分隔的整數,為小東父親要求小東在這一天用於複習時間的範圍
iminTime和imaxTime
0<=iminTime<=imaxTime<=8.

輸出:
對每組測試資料,若能夠做出一個滿足小東父親要求的時間表,則在單獨的一行中輸出Yes
,並在隨後的一行中給出每天覆習花費的時間。否則輸出No。若滿足要求的時間表不唯一,
小東希望給父親留下比較用功的映像,開始時每天覆習的時間比較長


樣例輸入:
1 48
5 7
2 5
0 1
3 5

樣例輸出:
No
Yes
1 4



問題分析:
利用貪心實現,告知了開始複習的時間比較長,設總共有d天,對於第i天,
則選擇滿足條件的最大值,也即滿足後面d-i天的需要,剩餘時間必須在後面d-i天的最小值
與最大值之間,




#include <iostream>

using namespace std;

int main()
{
	
	int Day;
	int SumTime;
	
	while(cin>>Day>>SumTime)
	{
		int *minTime = new int[Day];
		int *maxTime = new int[Day];
		int *dayTime = new int[Day];   //每天覆習時間
		
		for (int i = 0; i < Day; i++)
		{
			cin>>minTime[i]>>maxTime[i];
		}
		
		int tmpMin = 0;
		int tmpMax = 0;
		for (int i = 0; i < Day; i++)
		{
			tmpMin += minTime[i];
			tmpMax += maxTime[i];
		}
		
		bool flag = true;
		for (int i = 0; i < Day; i++)
		{
			if (SumTime < tmpMin || SumTime > tmpMax)
			{
				flag = false;
				break;
			}
			
			//求得第i天后面所需總時間範圍
			tmpMin -= minTime[i];
			tmpMax -= maxTime[i];
			
			//求得第i天滿足條件的時間範圍
			int tmin = SumTime - tmpMax;    
			int tmax = SumTime - tmpMin;
			
			int k;
			for (k = tmax; k >= tmin; k--)
			{
				//得到滿足條件的最大時間
				if (k >= minTime[i] && k <= maxTime[i])
				{
					dayTime[i] = k;
					break;
				}
			}
			if (k < tmin)
			{
				flag = false;
				break;
			}
			else{
				SumTime -= k;
			}
			
		}
		
		if (flag)
		{
			cout << "Yes" << endl;
			for (int i = 0; i < Day; i++)
			{
				cout << dayTime[i] << " " << endl;
			}
		}
		else{
			cout << "No" << endl;
		}
	
		
	}
	
	
	return 0;
}