/*
这题真是...检查到错误以后,才觉得十分惋惜...太惨了!
主要是,之前choosemax函数,本意是要找容积最大的,而...按照我代码的语义,a数组已经变为记录当前杯子装了多少,b数组才是真正的记录容量的数组,但被我给搞忘记了...真是十分难过和悲伤...
同时,也突然觉得,自己未免也太不小心了,自己改了a数组居然都不记得,不过以后,我觉得最好还是改b不改a,毕竟输入进的是a,这样应该能降低出错的可能(其实没什么大用,自己不小心,总还会有别的错的)
*/
#include <bits/stdc++.h>
using namespace std;
const int N = 105;
int a[N];
int b[N];
int full[N];
int choosemax(int n)
{
int max = 0, tp = 1, flag = 0;
for (int i = 1; i <= n; i++)
{
if (full[i])
continue;
if (b[i] > max)
{
tp = i; max = b[i]; flag = 1;
}
}
if (flag) return tp;
else return 0;//all the cups are full
}
void showa(int n)
{
cout << a[1];
for (int i = 2; i <= n; i++) cout << " " << a[i];
cout << endl;
}
int main()
{
int n, w;
while (cin >> n >> w)
{
memset(full, 0, sizeof(full));
int sum = 0, ans = -1;
for (int i = 1; i <= n; i++)
{
cin >> a[i], b[i] = a[i];
if (a[i] % 2) a[i] = a[i] / 2 + 1;
else a[i] /= 2;
sum += a[i];
}
if (sum > w)
{
cout << -1 << endl; continue;
}
// cout << sum << endl;
w -= sum;
// cout << w << endl;
// for (int i = 1; i <= n; i++) cout << endl << "test: " << a[i] << " ";
int max, t;
while (w > 0)
{
max = choosemax(n);
t = b[max] - a[max];
if (w >= t)
{
a[max] = b[max];
full[max] = 1;
w -= t;
}
else
{
a[max] += w;
w = 0;
}
}
showa(n);
}
return 0;
}
/*
这是参考了同学的代码,他用到了struct,也用到了sort,思路十分清晰...
突然想起,积分赛时,我还是想过要用sort的,但是最后发现,我自己的那种方法,似乎用不了sort,主要时下标、容量和已装体积,无法保证三者一一对应,而如果把三者放到一个struct里,事情就好解决多了
所以,struct...一定要活用啊!~
*/
#include <bits/stdc++.h>
using namespace std;
const int N = 105;
struct cup
{
int c, v, index;//分别依次为:容量、杯中茶的体积、排序前序号
bool operator < (const cup &b) const // 排序时以容积大小排序,容积大的排前面
{
return b.c < c;
}
}a[N];
int b[N];
int main()
{
int n, w;
cin >> n >> w;
int sum = 0, tp; //tp == temp
memset(a, 0, sizeof(a));
for (int i = 0; i < n; i++)
{
cin >> a[i].c;
a[i].index = i; //每次输入容量以后,先在结构体的index处标好号,就来倒酒,先将每个杯子都倒入一半(奇数体积另外处理)
if (a[i].c & 1) //用按位与符号判断奇偶
tp = (a[i].c + 1) >> 1;
else
tp = a[i].c >> 1;
a[i].v += tp;
sum += tp;
}
sort(a, a+n);
// cout << "test: " << endl; for (int i = 0; i < n; i++) cout << a[i].c << " "; cout << endl;
if (sum > w)
{
cout << -1 << endl; return 0;
}
for (int i = 0; i < n && sum < w; i++)
{
tp = min(w - sum, a[i].c - a[i].v);
sum += tp;
a[i].v += tp;
}
if (sum < w)
{
cout << -1 << endl; return 0;
}
for (int i = 0; i < n; i++)
{
b[a[i].index] = a[i].v;
}
for (int i = 0; i < n; i++)
cout << b[i] << " ";
cout << endl;
return 0;
}