1. 程式人生 > >Codeforces Round #521 (Div. 3) E. Thematic Contests

Codeforces Round #521 (Div. 3) E. Thematic Contests

題解

題目大意 每天完成若干個相同的任務 第二天完成的數量要求是前一天的兩倍 不同天不能完成相同的任務 問最大任務完成數量

統計相同編號的數量 向前做字首和 暴力列舉最後一次的完成數量 每次除以二檢測當前數量-天數(減去向前字首和的貢獻)是否大於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; }