传送门:POJ 3544
题意:将n个猪卖给n个村庄,猪重wi,每个村庄到起点的距离是dj,每斤猪肉在第j个村庄的单价是pj,每斤猪肉运输一个单位长度花费t元,为保证赚到最多的钱,该怎样分配。输出n个数,第j个数表示出售到第j个村庄的猪的编号,每只猪的编号从1开始。
题解:贪心。先求出每斤猪肉在每个村庄出售后能赚到的钱数,然后将体重最重的猪分配给钱数最多的村庄。
代码:
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>
#include <vector>
#include <set>
#include <map>
typedef long long ll;
using namespace std;
struct vallge
{
ll d;//距离
ll p;//价格
ll tmp;//净赚的钱数
ll numv;//村庄编号
}va[1005];
struct pig
{
ll w;//猪的重量
ll nump;//猪的编号
}pi[1005];
bool cmp1(struct vallge a,struct vallge b)//按净赚的钱数对村庄进行排序(由大到小)
{
return a.tmp>b.tmp;
}
bool cmp2(struct pig a,struct pig b)//对猪的重量进行排序(由大到小)
{
return a.w>b.w;
}
int main()
{
int n,t,i;
while(~scanf("%d%d",&n,&t))
{
for(i=0;i<n;i++)
{
cin>>pi[i].w;
pi[i].nump=i;//赋编号
}
for(i=0;i<n;i++)
{
cin>>va[i].d;
va[i].numv=i;//赋编号
}
for(i=0;i<n;i++)
{
cin>>va[i].p;
va[i].tmp=va[i].p-va[i].d*t;//求出在每个村庄净赚到的钱数
}
sort(va,va+n,cmp1);
sort(pi,pi+n,cmp2);
ll ans[10005];
for(i=0;i<n;i++)
ans[va[i].numv]=pi[i].nump;//将村庄和猪的编号一对一赋给数组
for(i=0;i<n-1;i++)
cout<<ans[i]+1<<" ";
cout<<ans[n-1]+1<<endl;
}
return 0;
}