B. Equalize
题目:
思路:首先排序然后去重(可以用set来去重),我们可以肯定的是,如果连续k个数最大值最小值的差小于等于n的话,那么这个长度为k的区间就符合答案要求,那么k就和答案取max。
代码:
void solve(){int n;cin >> n;vector<int>a(n);for(int i = 0;i < n; i++)cin >> a[i];sort(a.begin(),a.end());a.resize(unique(a.begin(),a.end()) - a.begin());int ans = 0;for(int i = 0;i < n;i ++){int r = lower_bound(a.begin(), a.end(), n + a[i]) - a.begin() - i;ans = max(ans, r);}cout << ans << endl;
}
C. Physical Education Lesson
题目:
思路:分别讨论n位于上坡还是下坡,如果位于上坡的话,那么n - x 是2*(k - 1)的倍数,如果位于下坡的话,那么n + x - 2是2*(k - 1)的倍数。求出所有可能的k,使得第n个数为x。
代码:
void solve(){int n, x;cin >> n >> x;int l = n + x - 2;int r = n - x;set<int>s;for(int i = 1;i <= l / i;i ++){if(l % i == 0){if(i % 2 == 0 && (i + 2) / 2 >= x)s.insert(i);if((l / i) % 2 == 0 && (l / i + 2) / 2 >= x)s.insert(l / i);}}for(int i = 1;i <= r / i;i ++){if(r % i == 0){if(i % 2 == 0 && (i + 2) / 2 >= x)s.insert(i);if((r / i) % 2 == 0 && (r / i + 2) / 2 >= x)s.insert(r / i);}}cout << s.size() << endl;
}
D. Lonely Mountain Dungeons
题目:
思路:假设当前有k队,某个种族有x人,当x≤k时,战力会增加C(x,2),当x>k时,会存在同一种族的人在相同的队伍中,假设有y人,那么需要减去C(y,2)。考虑到种族数量加起来为2e5,所以考虑暴力枚举k。
代码:
void solve(){int n, b, x;cin >> n >> b >> x;vector<int>a(n, 0);map<int,int>mp1;int maxval = 0;for(int i = 0;i < n;i ++){cin >> a[i];maxval = max(maxval, a[i]);mp1[a[i]]++;}int ans = 0;for(int i = maxval;i >= 1;i --){int sum = 0;for(auto tmp : mp1){int x = tmp.first / i;int cnt = tmp.first % i;sum += tmp.second * (tmp.first * (tmp.first - 1) / 2 - (cnt * (x + 1) * x / 2 + (i - cnt) * (x - 1) * x / 2));}int tmp1 = b * sum;tmp1 -= (i - 1) * x;ans = max(ans, tmp1);}cout << ans << endl;
}