大可以直接先加最小值然后去逐渐逼近目标值。
#include <iostream>
#include <queue>
#include <cstdio>
using namespace std;
int main()
{
int d,sumTime,l[35],r[35],a[35];
cin >> d >> sumTime;
for(int i = 0;i < d;++i){
cin >> l[i] >> r[i];
a[i] = l[i];
}
int s = 0,f;
for(int i = 0;i < d;++i){
s += l[i];
}
if(s > sumTime){
cout << "NO" << endl;
return 0;
}
if(s == sumTime){
puts("YES");
for(int i = 0;i < d - 1;++i){
printf("%d ",a[i]);
}
printf("%d\n",a[d - 1]);
return 0;
}
f = sumTime - s;
s = 0;
for(int i = 0;i < d;++i){
s += r[i];
}
if(s < sumTime){
cout << "NO" << endl;
return 0;
}
for(int i = 0;i < d;++i){
if(r[i] - l[i] >= f){
a[i] = l[i] + f;
break;
}
a[i] = r[i];
f = f - r[i] + l[i];
}
puts("YES");
for(int i = 0;i < d - 1;++i){
printf("%d ",a[i]);
}
printf("%d\n",a[d - 1]);
return 0;
}