题目链接:http://acm.hzau.edu.cn/problem.php?id=18
题意是给你两个长度为n的数组,a数组相当于1到n的物品的数量,b数组相当于物品价值,而真正的价值表示是b[i]*k*k(k表示取的数量),给你m表示最少取m个物品。然后让你求取m个的最小的价值和。
一个物品的价值是b[i] , 两个物品的价值是b[i] * 3 + b[i] ...
所以每个物品的价值是b[i] , b[i] * 3 , b[i] * 5 , b[i] * 7 ...
每个物品数量a[i]不超过100,所以总共不超过1e5个。所有的物品价值存到数组中,sort一下取前m个即可。
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <algorithm> 5 using namespace std; 6 typedef long long LL; 7 LL cost[100005] , a[1005] , b[1005]; 8 int main() 9 { 10 int n , m; 11 while(~scanf("%d %d" , &n , &m)) { 12 for(int i = 1 ; i <= n ; ++i) { 13 scanf("%lld" , a + i); 14 a[i] = min(a[i] , (LL)m); 15 } 16 int cnt = 0; 17 for(int i = 1 ; i <= n ; ++i) { 18 scanf("%lld" , b + i); 19 for(int j = 1 ; j <= a[i] ; ++j) 20 cost[cnt++] = (LL)(2 * j - 1) * b[i]; 21 } 22 sort(cost , cost + cnt); 23 LL sum = 0; 24 for(int i = 0 ; i < m ; ++i) { 25 sum += cost[i]; 26 } 27 printf("%lld " , sum); 28 } 29 }