2022.10.2每日刷题打卡(补

由于周日团建所以🕊了,今天补上。

Friends and the Restaurant

题目大意:

两两个一组,组中所有xi值的总和不得超过组中yi值的总和。

朋友可以光顾餐厅的最大天数是多少?

思路:既然是xi值总和不超过yi值总和,那么就直接把yi-xi的差值存起来,只需要找到一对(i,j)满足[(yi-xi)+(yj-xj)]>=0就行了,所以选择对所有yi-xi存起来,排序双指针。

AC代码:

#include <bits/stdc++.h>

void solve() {
	int n;
	std::cin >> n;
	std::vector<int>a(n), b(n), c(n);
	for (int i = 0; i < n; i++) {
		std::cin >> a[i];
	}
	for (int i = 0; i < n; i++) {
		std::cin >> b[i];
		c[i] = b[i] - a[i];
	}
	std::sort(c.begin(), c.end());
	int l = 0, r = n - 1, ans = 0;
	while (l < r) {
		if (c[l] + c[r] >= 0) {
			ans++, l++, r--;
		} else {
			l++;
		}
	}
	std::cout << ans << "\n";
}

int main() {
	std::ios_base::sync_with_stdio(false);
	std::cin.tie(nullptr);
	int t;
	std::cin >> t;
	while (t--) {
		solve();
	}
	return 0;
}

 另外补一下周赛的一道题,虽然做对了,但是又要复盘一下思路。

七便士

 思路:根据题意

 那我们就把变建出来:

	int g[8][8];
	for (int i = 1; i <= 8; i++) {
		g[i][(i + 2) % 8 + 1] = g[i][(i + 4) % 8 + 1] = 1;
	}
	for (int i = 1; i <= 8; i++) {
		for (int j = 1; j <= 8; j++) {
			std::cout << g[i][j];
		}
		std::cout << "\n";
	}

如此跑出来:

00010100
00001010
00000101
10000010
01000001
10100000
01010000
00101001

跑出来大概就是这个样子,忽略最后一个这就是建边情况。

那么我们可以画出以下图:

图比较简陋凑合看吧/(ㄒoㄒ)/~~

那么我们就可以两两找边,有边且都是0那就++,最后判断是否有7个便士即可

AC代码如下:

#include <bits/stdc++.h>

int a[] = {0, 1, 4, 7, 2, 5, 8, 3, 6};

int main() {
	std::ios_base::sync_with_stdio(false);
	std::cin.tie(nullptr);
	int t;
	std::cin >> t;
	while (t--) {
		char s[100];
		int cnt = 0;
		for (int i = 1; i <= 8; i++) {
			std::cin >> s[i];
			if (s[i] == '1') cnt++;
		}
		if (s[a[1]] == '0' && s[a[8]] == '0') cnt++;
		for (int i = 1; i < 8; i++) {
			if (s[a[i]] == '0' && s[a[i + 1]] == '0') cnt++;
		}
		if (cnt >= 7) {
			std::cout << "Yes\n";
		} else std::cout << "No\n";
	}
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值