题意:给一个数字n,还有一些区间,在区间内选取一个数字,使得所有数字相加等于0.
分析:先令所有数字为右区间,如果(最大的数字)小于0,那么永远都不可能变成0,如果(最小的数字)大于0,那么永远都不可能变成0,再从1遍历到n,判断数字是否要向左移动(向左移动了sum就会变小)
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main(){
int n;cin>>n;
ll l[n+10],r[n+10];
int a[n+10];
ll sum=0;
for(int i=1;i<=n;i++){
cin>>l[i]>>r[i];
sum+=r[i];
}
if(sum<0)cout<<"No"<<endl;
else{
for(int i=1;i<=n;i++){
if(sum>r[i]-l[i]){//如果sum-区间差还是无法等于0,直接让他取最小值
sum-=(r[i]-l[i]);
r[i]=l[i];
}
else if(sum==0)break;
else{//sum-区间内的一个数可以变成0
r[i]-=sum;
sum=0;
}
}
if(sum>0){
cout<<"No"<<endl;return 0;
}
cout<<"Yes"<<endl;
for(int i=1;i<=n;i++){
cout<<r[i]<<" ";
}
}
}