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;
}