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         
原文地址:https://www.cnblogs.com/wally/p/3055334.html