Codeforces Round #376 (Div. 2) F. Video Cards 前缀和

F. Video Cards

链接:

http://codeforces.com/contest/731/problem/F

题意:

给一个n长度的序列,问从序列中找一个数作为第一个数,把不小于它的数变成它或者它的倍数(不是他的倍数时只能减小成为他的倍数),并使得这些数的和最大。

题解:

对所有数进行排序,从前到后枚举每个数成为第一个数,然后枚举倍数j,找到在这个数j倍的数目,然后和这个数相乘,然后求和取最大就可以了。

注意要去重。

代码:

 1 #include<iostream>
 2 #include<algorithm>
 3 using namespace std;
 4 
 5 typedef long long ll;
 6 const int maxn = 2e5 + 7;
 7 ll a[maxn];
 8 
 9 int main()
10 {
11     int n;
12     cin >> n;
13     for (int i = 0; i < n; i++) cin >> a[i];
14     sort(a, a + n);
15     ll ans = 0;
16     for (int i = 0; i < n; i++) {
17         ll sum = 0;
18         if ((a[i] != a[i - 1]) || (i == 0)) {
19             for (ll j = a[i]; j <= a[n - 1]; j += a[i]) {
20                 ll k = upper_bound(a, a + n, j - 1) - a;
21                 sum += (n - k)*a[i];
22             }
23             ans = max(ans, sum);
24         }
25     }
26     cout << ans << endl;
27     return 0;
28 }

 

posted @ 2016-10-20 00:49  Flowersea  阅读(267)  评论(0编辑  收藏  举报