京東2016筆試題,小東複習
阿新 • • 發佈:2019-01-08
問題描述:
臨近期末,讓小東頭疼的考試又即將到來了,而且是小東最不喜歡的科目,遺憾的事,
小東得知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; }