见注释
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<string>
#include<stack>
#include<queue>
#include<cmath>
#include<stack>
#include<list>
#include<map>
using namespace std;
typedef long long ll;
int a[105];
int b[105];
int main()
{
int n,w,i,j,k;
while(scanf("%d%d",&n,&w)==2)
{
int sum2=0;
int w1=w;
for(i=1;i<=n;i++)
{
scanf("%d",&a[i]);
b[i]=a[i];
if(a[i]%2==0)
{
sum2+=a[i]/2;
b[i]-=a[i]/2; //相当于已经在a[i]中倒了一半的水 b[i]为剩下的容量
w1-=a[i]/2; //壶里还剩下多少茶
}
else
{
sum2+=a[i]/2+1; //与if语句同理
b[i]-=a[i]/2+1;
w1-=a[i]/2+1;
}
}
if(w1<0) //茶不够
{
printf("-1\n");
continue;
}
while(w1!=0) //这题n比较小 w的最大值也很小 直接暴力过了..没想到这么水..
{
int t=0;
int maxn=-1;
for(i=1;i<=n;i++)
{
if(b[i]>maxn) //求出剩余容量最大的那个 容器的容量大的比容量小的 装满一半后 未装一半的容量肯定还大 else if中有个特例
{
maxn=b[i];
t=i;
}
else if(b[i]==maxn)
{
if(a[i]%2==1) // 若a[i]==9 则剩下4 若a[i]==8 也剩下4 根据题意我们要优先装容量大的 所以要记录a[i]为奇数的下标
{
t=i;
}
}
}
if(w1-b[t]>=0) //if else 里语句很好理解吧..
{
w1-=b[t];
b[t]=0;
}
else
{
b[t]-=w1;
w1=0;
}
}
for(i=1;i<=n;i++)
{
printf("%d%c",a[i]-b[i],i==n?'\n':' '); //输出a[i]-b[i],就是最终结果了
}
}
return 0;
}