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<=1040%的数据 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;
}