Codeforces Round 924 (Div. 2) B - D

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

  • 9
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

临江浪怀柔ℳ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值