cf4b

题目链接: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         

 

你可能感兴趣的:(c)