题意:给一个数字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 ln+10,rn+10;
int an+10;
ll sum=0;
for(int i=1;i<=n;i++){
cin>>li>>ri;
sum+=ri;
}
if(sum<0)cout<<"No"<<endl;
else{
for(int i=1;i<=n;i++){
if(sum>ri-li){//如果sum-区间差还是无法等于0,直接让他取最小值
sum-=(ri-li);
ri=li;
}
else if(sum==0)break;
else{//sum-区间内的一个数可以变成0
ri-=sum;
sum=0;
}
}
if(sum>0){
cout<<"No"<<endl;return 0;
}
cout<<"Yes"<<endl;
for(int i=1;i<=n;i++){
cout<<ri<<" ";
}
}
}