理解好题意真的很重要啊!
这道题一开始没理解清楚题意,以为只要最后把每个时长随机顺序输出来就行,结果。。。是我vegetable炸了。。
于是就重新写。😒
这是个比较典型的贪心题,我的思路就是先判断这个Peter能不能活下来,能不能满足要求。
这个判断是比较简单的,如果要每一天都满足要求的话,充要条件就是:
sum{ max[i] } <= sumTime
&&
sum{ min[i] } <= sumTime
这样就判断出来了。
接下来就是分配时长。
既然已经"YES"了,说明至少每一天 min[i] 是能够满足的,所以先分配给每一天一个 min[i] ,在我的代码里方便起见直接使用了 minax[i][0] 这个数组储存每天的时长,接下来就循环判断了,如果某一天能达到 max[i] ,就直接分配给他该天的最大时长,就一直这样分配,直到出现不能取 max[i],就直接取剩余的 sumTime 即可。
后面的时长自然而然地就是 minax[i][0] 本身的值了。
思路还是比较清晰简单的,主要是细节要注意到位…这种分配的思想也要多掌握。
以下是C++代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
int d;
int sumtime;
int minax[100][2]={0};
int sum1=0,sum2=0;
int i;
int main()
{
cin>>d>>sumtime;
for(i=0;i<d;i++)
{
cin>>minax[i][0]>>minax[i][1];
sum1+=minax[i][0];
sum2+=minax[i][1];
}
if(sumtime >= sum1 && sumtime <= sum2)
{
cout<<"YES"<<endl;
i=0;
sumtime-=sum1;
while(sumtime)
{
if(sumtime > minax[i][1]-minax[i][0])
{
sumtime-=minax[i][1]-minax[i][0];
minax[i][0]=minax[i][1];
}
else
{
minax[i][0]+=sumtime;
sumtime=0;
}
i++;
}
for(i=0;i<d;i++)
{
cout<<minax[i][0]<<" ";
}
}
else
{
cout<<"NO"<<endl;
return 0;
}
return 0;
}
希望能和大家互相学习。