题意
有n个茶杯,w毫升水,要求每个茶杯中的水不小于茶杯容积的一半,w毫升水全部倒进茶杯中,以及不存在茶杯容积小的比大的里边的水多的情况,问是否存在一种倒水的方法满足条件
思路
贪心,先对茶杯容积排序,然后从容积小的开始倒,先倒茶杯容积的一半和上一个茶杯中水量的较大值保证满足条件,然后如果还有剩余的水再从容积大的开始倒,使得每一杯尽量满但不多于上一个杯子中的水量,倒完为止,如果在第一步出现了水不足或者有一个杯子需要倒的水超过了它的容积,那就是无解,如果在第二步后水还有剩余,也是无解
代码
#include <cstdio>
#include <algorithm>
using namespace std;
pair<int,int> a[102];
int ans[102];
int main()
{
int n,w,f,t,p;
scanf("%d%d",&n,&w);
for(int i=0;i<n;i++)
scanf("%d",&a[i].first);
for(int i=0;i<n;i++)
a[i].second=i;
sort(a,a+n);
f=0;
for(int i=0;i<n;i++)
{
if(i==0)
t=(a[i].first+1)/2;
else t=max((a[i].first+1)/2,ans[a[i-1].second]);
if(w<t||t>a[i].first)
{
f=1;
break;
}
w-=t;
ans[a[i].second]=t;
}
if(f==1)
printf("-1\n");
else
{
p=n-1;
while(w>0&&p>=0)
{
if(p==n-1)
t=a[p].first;
else t=min(a[p].first,ans[a[p+1].second]);
if(w-t+ans[a[p].second]>=0)
{
w-=t-ans[a[p].second];
ans[a[p].second]=t;
}
else
{
ans[a[p].second]+=w;
w=0;
}
p--;
}
if(w>0)
printf("-1\n");
else
{
for(int i=0;i<n-1;i++)
printf("%d ",ans[i]);
printf("%d\n",ans[n-1]);
}
}
return 0;
}