Nebius Welcome Round (Div. 1 + Div. 2)C,D

C. Pull Your Luck

思路:打表+推导

打表看出有循环,大概是2*n必定循环。自己推导一遍证明:

\frac{(f+2n)*(f+2n+1)}{2}-\frac{f*(f+1)}{2}\equiv \frac{(f+2n)^{2}-f^{2}+(f+2n)-f}{2}\equiv \frac{4n^{2}+2n}{2} \equiv0(mod \ n)

所以我们暴力 min(p,2n)即可

#include <bits/stdc++.h>
using namespace std;
#define ll               long long
#define endl             "\n"
#define int              long long
const int N = 1e5 + 100;
void mysolve()
{
	int n, x, p;
	cin >> n >> x >> p;
	int sum = 0;
	for (int i = 1; i <= 2 * n && i <= p; ++i)
		{
			sum += i;
			if (sum % n == (n - x) % n)
				{
					cout << "YES" << endl;
					return;
				}
		}
	cout << "NO" << endl;
}

int32_t main()
{
	std::ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
	ll t;
	cin >> t;
	while (t--)
		{
			mysolve();
		}
	system("pause");
	return 0;
}

D. Accommodation

思路:贪心

  1. 假设字符串有cnt个1,显然最多cnt户人
  2. 讨论最少
    1. 如果我们能让2个一起,就可以减少一户了,每凑成一对11,我就等价于成功消灭1户(最多凑m/4户,剩下就只能单了)
  3. 讨论最多:
    1. 我们需要尽可能让1能自成一家,换句话说,不想让11凑一起。11凑一起最多也就只能m/4对,如果我们这m/4对都尽可能挤满了不是11对的,是不是我的结果就会尽可能大。答案是cnt-min(two1,m/4)
    2. 所以,我们每次找不是11的对去匹配,配到m/4对(配不到,只能没办法剩下对数只能是11了,每算入一对11,我们就等于血亏一户)。所以答案是cnt-(m/4-min(m/4,two2))
#include <bits/stdc++.h>
using namespace std;
#define ll               long long
#define endl             "\n"
void mysolve()
{
	int n, m;
	cin >> n >> m;
	string s;
	int minn = 0, maxn = 0;
	while (n--)
		{
			cin >> s;
			int two = 0, cnt =  count(s.begin(), s.end(), '1');//先用count记录字符串1的个数
			for (int i = 0; i < m - 1; ++i)if (s[i] == '1' && s[i + 1] == '1')two++, i++;//第一个two记录11对数
			two = min(m / 4, two);
			minn += cnt - two;

			two =  0;//这个two记录不是11的对数
			for (int i = 0; i < m - 1; ++i)if (s[i] != '1' || s[i + 1] != '1')two++, i++;
			two = min(m / 4, two);
			maxn += cnt - (m / 4 - two);
		}
	cout << minn << ' ' << maxn << endl;
}

int32_t main()
{
	std::ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
	mysolve();
	system("pause");
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值