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 }