Codeforces Round #674(Div. 3)A - E

A. Floor Number
题目大意:
公寓中,除了第一层有两间房,其他每层都有x间房,所有的房间都按号码编号,给出一个房间号问他在第几层。
思路:
先减去起初的两间再除以每一层的房间数即可。


#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
int main() {
	int t;
	cin >> t;
	while (t--)
	{
		int n, x;
		cin >> n >> x;
		int ans = 1;
		n -= 2;
		if (n <= 0)cout << 1 << endl;
		else {
			ans += ceil((double)n / x);
			cout << ans << endl;
		}
	}

}


B. Symmetric Matrix
题目大意:
给定n种2x2的瓷砖,瓷砖的左上右上左下右下都有一个数字,每种瓷砖的数量无限,且不能分割,问能否最后拼出一个mxm的主对角线对称矩阵。
思路:
首先m为奇数时肯定不成立,其次只要存在至少一个瓷砖主对角线对称即可。

#include<iostream>
using namespace std;
int main() {
	int t;
	cin >> t;
	while (t--)
	{
		int n, m;
		cin >> n >> m;
		int a, b, c, d;
		int flag = 0;
		for (int i = 1; i <= n; i++) {
			cin >> a >> b >> c >> d;
			if (c==b)flag = 1;
		}
		if (m % 2 || !flag)puts("NO");
		else puts("YES");
		
	}
}

C Increase and Copy
题目大意:
一个数组初始时只有一个元素且为1,每次操作可以对任意一个数进行加一或者,复制某一个数并放在数组的最后,问最少几次操作后可以使得数组中所有元素之和为n。
思路:
我们发现,答案在√n处出现,且要进行√n - 1 + (n / √n)- 1次操作,若此时数组之和不为n则加一。

#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
long long n;

int main() {
	int t;
	scanf("%d", &t);
	while (t--)
	{
	
		scanf("%lld", &n);
		long long s = sqrt(n);
		long long ans = (s + (n / s) - 2);
		if (n % s)ans++;
		printf("%lld\n", ans);
		
	}
}

D Non-zero Segments
题目大意:
给定一个序列,求最少插入多少数,才能使此序列任意子段和均不为 0 .

插入的数字可以是你能想到的所有整数,
思路:
一开始想用o(n^2)的思路,果然被卡了。。所以我们用一个前缀和数组进行预处理,如果我们又发现一个点使得sum[ i ] = sum [ j ],则说明在i-j区间内有子序列之和为0,我们就可以用一个map打上一个标记,记录上一个为0的位置,意味着在此之前我们插入了一个极大的数,但是后面的前缀和并不受影响。

#include<iostream>
#include<algorithm>
#include<cmath>
#include <map>
using namespace std;
const int N = 200010;
typedef long long ll;
ll a[N];
map<ll, bool>mp;
int main() {
	int n;
	scanf("%d", &n);
	for (int i = 1; i <= n; i++) 
		scanf("%lld", &a[i]);
	ll sum = 0, ans = 0; mp[0] = true;//首先要将0的位置标记
	for (int i = 1; i <= n; i++) {
		sum += a[i];

		if (mp[sum]) {
			ans++;
			mp.clear();
			sum = a[i];
			mp[0] = true;
		}
		mp[sum] = true;
	}
	cout << ans<<endl;
}

E Rock, Paper, Scissors
题目:
石头剪刀布,输出Alice能赢的最少次数和最多次数。
思路:
最多就直接判断即可,最少时先判断平局,再判断输局。

#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N = 4;
ll a[N], b[N];
int main() {
	int n;
	cin >> n;
	for (int i = 1; i <= 3; i++)cin >> a[i];
	for (int i = 1; i <= 3; i++)cin >> b[i];
	ll mians = 0, maans = 0;
	ll c = 0, d = 0, e = 0;
	if (a[1] - b[1] - b[3] > 0) c = a[1] - b[1] - b[3];
	if (a[2] - b[2] - b[1] > 0) d = a[2] - b[2] - b[1];
	if (a[3] - b[3] - b[2] > 0) e = a[3] - b[3] - b[2];

	mians = c + d + e;
	maans = min(a[1], b[2]) + min(a[2], b[3]) + min(a[3], b[1]);
	cout << mians << ' ' << maans;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值