送货的难题->简单的贪心

Nc有一个小小的愿望,能够帮kiko过一个有意义的生日,但是由于资金不够,Nc必须自己想办法赚money。想了很久,Nc决定卖花赚钱。现在Nc有n种漂亮的花,每种花各有ai盆,需要销往n个不同的城市,且每一种花只能销往一个地方,一个地方只能销售一种花。第i个城市距离Nc所在地为di公里,每一种花在第i个城市的卖价为vi,现在Nc需要将n种花分别运往n个不同的城市销售,每公里每盆花的运费为t。现在Nc想知道怎样销售才能赚最多的钱。

输入格式:

第一行两个整数n,t如题所述
第二行n个整数 ai,表示第i种花的盆数
第三行n个整数di, 表示第i个城市的距离
第四行n个整数vi,表示每种花在第i个城市的价格

输出格式:

只有一行,n个整数,第i个数ci表示第i种花销往第ci个城市

样例输入:

3 1
10 20 15
10 20 30
50 70 60
<strong>
</strong>

样例输出:

3 2 1

数据范围:

20%的数据 n<=10
40%的数据 n<=100
100%的数据 n<=1000,1<=t,ai,di,vi<=10^9
思路:仔细分析可知道花虽然有多种但是其实只相当于一个背包(每种花不能分开)
而且NC的每一棵花到每个城市的活力是可求的,越多的花到获利越多的城市赚的越多这样的贪心策略的正确性是显而易见的。
代码:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
long long dp[1002],d[1002],v[1002];
struct mark{
long long id,num;
}a[1002];
struct why{
long long id,v;
}f[1002];
bool cmp(mark a,mark b){
return a.num>b.num;
}
bool cmp1(why a,why b){
return a.v>b.v;
}
int main()
{
    int n,t;
scanf("%d%d",&n,&t);
for(int i=1;i<=n;i++){
    scanf("%lld",&a[i].num);
    a[i].id=i;
}
for(int i=1;i<=n;i++){
    scanf("%lld",&d[i]);
 
}
for(int i=1;i<=n;i++){
    scanf("%lld",&v[i]);
}
for(int i=1;i<=n;i++){
    f[i].v=v[i]-d[i]*t;
    f[i].id=i;
}
sort(f+1,f+n+1,cmp1);
sort(a+1,a+n+1,cmp);
for(int i=1;i<=n;i++){
    dp[a[i].id]=f[i].id;
}
for(int i=1;i<=n;i++){
    printf("%lld ",dp[i]);
}
    return 0;
}



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值