Codeforces Round #521 (Div. 3) E. Thematic Contests
阿新 • • 發佈:2018-11-19
題解
題目大意 每天完成若干個相同的任務 第二天完成的數量要求是前一天的兩倍 不同天不能完成相同的任務 問最大任務完成數量
統計相同編號的數量 向前做字首和 暴力列舉最後一次的完成數量 每次除以二檢測當前數量-天數(減去向前字首和的貢獻)是否大於0 大於則滿足 每次結束檢測是否為奇數 乘二不可能為奇數所以跳出
AC程式碼
#include <stdio.h>
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int INF = 0x3f3f3f3f;
const int MAXN = 2e5 + 10;
int a[MAXN];
int main()
{
#ifdef LOCAL
freopen("C:/input.txt", "r", stdin);
#endif
map<int, int> mp;
int N;
cin >> N;
for (int i = 0; i < N; i++)
{
int x;
scanf("%d", &x);
mp[x]++;
}
for (auto it = mp.begin(); it != mp.end(); it++) //統計數字出現次數
a[ it->second]++;
for (int i = N; i >= 1; i--) //次數做字首和 出現多的可以當做少的用
a[i] += a[i + 1];
int ans = 0;
for (int i = 1; i <= N; i++) //暴力列舉最後一天的數量
{
int s = 0, cnt = 0; //求和 天數
for (int j = i; j >= 1; j >>= 1)
{
if (a[j] - cnt <= 0) //減去天數為當前次數的數量
break;
s += j;
cnt++;
if (j & 1) //2的倍數不可能為奇數
break;
}
ans = max(ans, s);
}
cout << ans << endl;
return 0;
}