題目:
用一個map<a,b>m,先sort後,a表示杯子的標號,b表示排序後杯子的id,建立一個由a→b的一個hash
code:
#include<cstdio>
#include<map>
#include<algorithm>
#define MIN(a,b) (a<b?a:b)
using namespace std;
const int MAXN=100+5;
struct friends{
int ID,cup,has;
}q[MAXN];
int a[MAXN],n,w;
bool cmp(friends x,friends y){
return x.cup<y.cup;
}
int main(){
scanf("%d%d",&n,&w);
for(int i=0;i<n;++i){
q[i].ID=i;
scanf("%d",&q[i].cup);
}
sort(q,q+n,cmp);
map<int,int>m;
for(int i=0;i<n;++i)
m[q[i].ID]=i;
//ID -> i
int sum=0;
for(int i=0;i<n;++i){
sum+=(q[i].cup-1)/2+1;
q[i].has=(q[i].cup-1)/2+1;
}
if(sum>w){
printf("-1\n");
return 0;
}
w-=sum;
for(int i=n-1;i>=0;--i){
int pour=min(q[i].cup-q[i].has,w);//min(杯子最多還能裝多少,還剩多少水)
w-=pour;
q[i].has+=pour;
if(w==0)break;
}
if(w>0){
printf("-1\n");
}else{
for(int i=0;i<n;++i)
printf("%d ",q[m[i]].has);//現在的i代表杯子原來的ID噢
}
return 0;
}
//ps:其實沒必要用map,就用普通的數組就可以了,只不過養成了壞習慣。