题目链接:http://www.codeforces.com/problemset/problem/4/B
思路:一开始我看数据也不大,然后就dfs暴搜了一下,orz.....,TLE,然后看了别人的贪心策略,佩服得五体投地啊!!!可以先把Min,Max求出来,然后从第一个MAX[i]开始减,边界条件为MAX[i]>MIN[i]&&r>sum;
View Code
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 using namespace std; 5 int MIN[33]; 6 int MAX[33]; 7 8 int main(){ 9 int n,sum; 10 while(~scanf("%d%d",&n,&sum)){ 11 int l=0,r=0; 12 for(int i=1;i<=n;i++){ 13 scanf("%d%d",&MIN[i],&MAX[i]); 14 l+=MIN[i]; 15 r+=MAX[i]; 16 } 17 if(l<=sum&&sum<=r){ 18 for(int i=1;i<=n;i++){ 19 //这样的话,前面几个都是尽量接近MIN[i]; 20 while(MAX[i]>MIN[i]&&r>sum){ 21 MAX[i]--;r--; 22 } 23 } 24 puts("YES"); 25 for(int i=1;i<n;i++){ 26 printf("%d ",MAX[i]); 27 } 28 printf("%d",MAX[n]); 29 }else 30 puts("NO"); 31 } 32 return 0; 33 } 34 35 36 37 38