题目
源地址:
http://codeforces.com/contest/4/problem/B
理解
水题一枚。 首先计算出最小的边界和,然后计算出最大的边界和。只要题目给定的sum不在这个范围内,一定无解。然后使用贪心的方法,计算出tem=最大边界和-sum。然后一个一个减去两个边界之间的差值,直到tem被减为零。
代码
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <ctime>
#include <iostream>
#include <algorithm>
#include <string>
#include <vector>
#include <deque>
#include <list>
#include <set>
#include <map>
#include <stack>
#include <queue>
#include <numeric>
#include <iomanip>
#include <bitset>
#include <sstream>
#include <fstream>
#define debug "output for debug\n"
#define pi (acos(-1.0))
#define eps (1e-8)
#define inf (1<<28)
#define ll long long int
using namespace std;
#define MAXN 30+10
int sum,d,Max[MAXN],Min[MAXN];
int main(int argc, char const *argv[])
{
while(~scanf("%d %d",&d,&sum))
{
int Maxt=0,Mint=0;
for(int i=0;i<d;i++)
{
scanf("%d %d",Min+i,Max+i);
Mint+=Min[i];
Maxt+=Max[i];
}
if(sum>=Mint&&sum<=Maxt)
{
puts("YES");
int tem=Maxt-sum;
for(int i=0;i<d;i++)
{
if(Max[i]-Min[i]<tem)
{
tem-=(Max[i]-Min[i]);
Max[i]=Min[i];
}
else
{
Max[i]-=tem;
break;
}
}
for(int i=0;i<d;i++)
if(i!=d-1)
printf("%d ",Max[i]);
else
printf("%d\n",Max[i]);
}
else
{
puts("NO");
}
}
}
更新日志
- 2014-11-3 已AC。