Before an Exam
明天皮特将要考生物。他并不很喜欢生物,但在 d 天前他得知他将不得不参加此次考试。皮特严厉的父母勒令他立即复习,因此他在第 i天将需要学习不少于 minTime小时,不多于 maxTime小时。他们同时警告皮特:考试前一天,他将被检查他复习的完成情况。因此,今天皮特的父母会要求他展示他考前复习的学习时间表。然而,他只记录这 dd天以来他复习所用的总计用时 sumTime小时.现在他希望知道他能否给他的父母展示一份时间表,包含 d个数,每个数 schedule表示皮特第 i 天在复习生物上的用时(单位为小时),并应满足上文提及的要求。
如果有解,在单独一行输出 YES,换行,输出任意一种满足上文要求的解。如果无解,在单独一行中输出 NO。
这个题首先把最小时间和最大时间分别加起来,与sumtime比较,在之间为“YES”,否则为“NO”。然后先把每个最小时间给他们,然后从第一个开始一次把做大值给他们,直到sumtime为0.
#include<bits/stdc++.h>
using namespace std;
int maxi[50],mini[50],ans[50];
int main()
{
int n,s,maxs=0,mins=0;
cin>>n>>s;
for(int i=0; i<n; i++)
{
cin>>mini[i]>>maxi[i];
mins+=mini[i];
maxs+=maxi[i];
}
if(s>=mins&&s<=maxs) cout<<"YES"<<'\n';
else
{
cout<<"NO";
return 0;
}
s-=mins;
for(int i=0; i<n; i++)
if(s-(maxi[i]-mini[i])>0)
{
s-=maxi[i]-mini[i];
ans[i]=maxi[i];
}
else
{
ans[i]=mini[i]+s;
s=0;
}
for(int i=0; i<n; i++) cout<<ans[i]<<' ';
return 0;
}