题目:http://codeforces.com/problemset/problem/4/B
题解:有d组min max值以及一个sum值,现在要求d个介于min和max之间的数,让其和为sum。此题可以先从sum中减去所有的min,然后对剩下的值进行处理,对其分配时不能超过每一对max-min的值,如果能全部分完,则满足要求。
#include<cstdio> #include<iostream> #include<cstring> using namespace std; int main() { int d,sum,x,q; int a[250],b[250]; cin>>d>>sum; for(int i=0;i<d;i++) { cin>>a[i]>>b[i]; sum-=a[i]; } if(sum<0) { cout<<"NO"<<endl; return 0; } int c[250],cnt=0; for(int i=0;i<d;i++) { c[i]=a[i]; x=b[i]-a[i]; if(x<sum) { c[i]+=x; sum-=x; } else { c[i]+=sum; sum=0; } } if(sum) { cout<<"NO"<<endl; } else { cout<<"YES"<<endl<<c[0]; for(int i=1;i<d;i++) cout<<" "<<c[i]; cout<<endl; } return 0; }