首先把题目读懂:
要求输出j-th是哪头猪在j-th村庄卖,而不是j-th猪在哪个村庄卖。
因为这个题目需要位置。如第j头猪,还有第i个村庄之类的信息,所要必须保存他们各自的位置。使用2个struct。
贪心:
给出了到每个村庄的距离d,然后还有每个村庄的price,我们可以算在每个村庄猪的纯price是多少(把一斤猪带到j村庄到底值多少钱),就是当地猪的price-d*t;然后使用担心排序就好了,
不过排序有点烂,我用的冒泡,因为写起来简单,这个是题目没有处理好的地方。
hint:wa了很多次,一直用的long,后来看了discuss才知道,d*t有可能long放不下,后来改成long long才ac,这个很迷糊人。
代码:
#include<algorithm>
#include<iostream>
#include<stdio.h>
struct weight
{
int id;
long w;
};
struct weight ww[1002];
struct price
{
int id;
long p;
};
struct price pp[1002];
long d[1002];
int res[1002];
int n;
long t;
int main()
{
int i,j;
long x;
scanf("%d%ld",&n,&t);
for(i=1;i<=n;i++)
{
scanf("%ld",&x);
ww[i].w=x;
ww[i].id=i;
}
for(i=1;i<=n;i++)
scanf("%ld",&d[i]);
for(i=1;i<=n;i++)
{
scanf("%ld",&x);
pp[i].p=x;
pp[i].id=i;
}
for(i=1;i<=n;i++)//计算村庄i每斤猪farmer到底可以获得多少钱。
pp[i].p-=d[i]*t;
for(i=1;i<=n;i++)//对farmer的每斤猪每斤猪可以获得多少钱从大到小排序。
for(j=i+1;j<=n;j++)
if(pp[i].p<pp[j].p)
{
x=pp[i].p;
pp[i].p=pp[j].p;
pp[j].p=x;
x=pp[i].id;
pp[i].id=pp[j].id;
pp[j].id=x;
}
// for(i=1;i<=n;i++)
// printf("%d %d/n",pp[i].p,pp[i].id);printf("/n/n");
for(i=1;i<=n;i++)//猪从大到小排序。
for(j=i+1;j<=n;j++)
if(ww[i].w<ww[j].w)
{
x=ww[i].w;
ww[i].w=ww[j].w;
ww[j].w=x;
x=ww[i].id;
ww[i].id=ww[j].id;
ww[j].id=x;
}
// for(i=1;i<=n;i++)
// printf("%d %d/n",ww[i].w,ww[i].id);
for(i=1;i<=n;i++)//最大的猪卖最贵的价钱,最小的猪卖最便宜的价钱。
res[ww[i].id]=pp[i].id;
for(i=1;i<n;i++)
printf("%d ",res[i]);
printf("%d/n",res[n]);
return 0;
}