Recoder

题目链接: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\n" , sum);
28     }
29 }

 

分类:

技术点:

相关文章:

  • 2021-12-30
  • 2017-12-11
  • 2021-01-31
  • 2021-11-03
  • 2021-04-18
  • 2021-11-30
  • 2021-09-18
  • 2021-09-18
猜你喜欢
  • 2021-10-09
  • 2021-10-09
  • 2021-10-09
  • 2021-11-01
  • 2021-10-09
  • 2021-06-13
  • 2021-12-04
相关资源
相似解决方案