(hzau)华中农业大学第四届程序设计大赛网络同步赛 G: Array C

题目链接: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 }

 

posted @ 2016-05-15 21:11  Recoder  阅读(214)  评论(0编辑  收藏  举报