题目名字 Before an Exam
题意
给定天数和目标,然后接下来输入每天的最少时间和最多时间,先判断在每天的范围内能否完成目标,如果不能输出no,如果能就输出每天在给定范围内完成的时间
思路
- 先用maxsum来将每天的最大时间相加,minsum将每天最少的时间相加,判断maxsum是否小于sumtime且minsum是否大于sumtime,如果是输出no,不是就输出yes然后继续判断
- 先用sumtime减掉minsum,判断剩余的sumtime是否小于范围的差值,如果大于,就使这天的学习最小量变为最大学习量,为了后面的输出,继续判断,直到sumtime小于两个之间的差值,然后使这天的mintime加等于这个sumtime
3.最后循环输出d天的mintime;
算法一:贪心
代码
cpp
#include <bits/stdc++.h>
using namespace std;
int main() {
int d,sumtime;
cin>>d>>sumtime;
int mintime[d], maxtime[d];
int maxsum=0,minsum=0,temp=0;
for (int i=0;i<d;i++){
scanf("%d %d",&mintime[i],&maxtime[i]);
maxsum+=maxtime[i];
minsum+=mintime[i];
}
if(maxsum<sumtime||minsum>sumtime){
cout<<"NO"<<endl;
return 0;
}
else{
cout<<"YES"<<endl;
sumtime-=minsum;
int i=0;
while(sumtime){
if(sumtime>maxtime[i]-mintime[i]){
sumtime-=maxtime[i]-mintime[i];
mintime[i]=maxtime[i];
}
else{
mintime[i]+=sumtime;
sumtime=0;
}
i++;
}
for (int i=0;i<d;i++){
cout<<mintime[i]<<" ";
}
}
return 0;
}