Codeforces Round #674 (Div. 3)

A - Floor Number

输入房间号,问在第几层

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e5 + 5;
 
int main(void)
{
	int t, n, x;
	cin >> t;
	while (t--) {
		cin >> n >> x;
		if (n <= 2) {
			cout << 1 << endl;
		} else {
			int res = 1 + (n - 2) / x;
			if ((n - 2) % x != 0)
				res++;
			cout << res << endl;
		}
	}
	
	return 0;
}

B - Symmetric Matrix

左下角和右上角相等,并且m为偶数时满足条件

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e5 + 5;
 
int main(void)
{
	int t, n, m;
	int a, b, c, d;
	cin >> t;
	while (t--) {
		cin >> n >> m;
		bool f1, f2 = 0;
		f1 = (m % 2 == 0 ? 1 : 0);
		for (int i = 0; i < n; i++) {
			cin >> a >> b >> c >> d;
			if (b == c)
				f2 = 1;
		}
		cout << ((f1 && f2) ? "YES" : "NO") << endl;
	}
	
	return 0;
}

C - Increase and Copy

先增加到一个界限 n \sqrt n n ,然后再进行复制

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e5 + 5;
 
int main(void)
{
	int t, n, now, res;
	cin >> t;
	while (t--) {
		cin >> n;
		now = 1; res = 0;
		while (now <= (int)sqrt(n)) {
			now++; res++;
		}
		//cout << now << endl;
		now--; res--;
		int num = (n - now) / now;
		if ((n - now) % now != 0)
			num++;
		res += num;
		cout << res << endl;
	}
	
	return 0;
}

D - Non-zero Segments

要在任意两个数之前添加任意大小的数字,使得子段和没有等于0的,求最少添加几次?

如果子段和等于0,说明前缀和 s u m [ r ] − s u m [ l − 1 ] = 0 sum[r] - sum[l - 1]=0 sum[r]sum[l1]=0,即 s u m [ l − 1 ] = s u m [ r ] sum[l-1]=sum[r] sum[l1]=sum[r]

用一个map来进行记录,当前的前缀和出现的下标,如果之前出现过,并且是在上次添加元素之后,说明需要加一次数字

需要注意记录m[0]=1,因为 0 实际上是在下标 0 处出现的,懒得特判所以可以设置为 1

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 2e5 + 5;
 
ll sum[N];
map<ll, ll> m;
 
int main(void)
{
	ll n, t;
	ll l = -1, res = 0;
	cin >> n;
	m[0] = 1; 
	for (int i = 1; i <= n; i++) {
		scanf("%lld", &t);
		sum[i] = sum[i - 1] + t;
		if (m[sum[i]] && m[sum[i]] >= l - 1) {
			res++;
			l = i;
		} 
		m[sum[i]] = i;
	}
	cout << res << endl;
	
	return 0;
}

F题的题解:

https://www.cnblogs.com/BOZHAO/p/13747452.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值