题目链接:
题意是给你两个长度为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 #include2 #include 3 #include 4 #include 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\n" , sum);28 }29 }