poj 3544 Journey with Pigs(简单的贪心)


首先把题目读懂:
要求输出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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值