初二20210529综合测试总结

本文分享了两个编程题目解法,一是利用绝对值差的枚举策略解决先手玩家策略问题,二是通过模拟操作还原k位置的简单算法。展示了如何在有限时间内找到最优解并避免复杂边界处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#1:Absolute Game

T1

思路:

一开始拿到这道题没有什么思路,大概算了算样例,想到一个用前缀和求出绝对值差的方案,结果。。。。

正解:

因为所有人足够聪明,又因为我们已经知道了“A”是先手,所以我们可以枚举A每次选择剩下的那个数 k k k,那么B肯定会剩下一个与 k k k绝对值差最小的数,所以直接枚举,时间复杂度 O ( n 2 ) O(n^2) O(n2)

#include <iostream>
#include <cstdio>
using namespace std;
const int MAXN = 1005;
int n, m, a[MAXN], b[MAXN];
int Abs(int s) {
	if(s < 0) return -s;
	return s;
}
int main() {
	scanf("%d", &n);
	for(int i = 1;i <= n; i++) scanf("%d", &a[i]);
	for(int i = 1;i <= n; i++) scanf("%d", &b[i]);
	int _max = -0x3f3f3f3f;
	for(int i = 1;i <= n; i++) {
		int _min = 0x3f3f3f3f;
		for(int j = 1;j <= n; j++) _min = min(_min , Abs(a[i] - b[j]));
		_max = max(_max, _min);
	}
	printf("%d", _max);
	return 0;
}

#2:「Copy and Paste 2」

T2

思路:

一开始想到了一个思路,就是手动模拟,结果发现要打递归,并且递归因为边界问题很难写,果断放弃。赛后发现可以逆推,瞬间想起自己放弃模拟,想打自己一巴掌。。。。

正解:

想到模拟这道题其实就非常简单,首先观察到 k k k很小,我们可以枚举k,然后用没次操作去还原k的位置(设操作‘A’,‘B’, ‘C’):
1.如整段操作都在此位置左边,它会把k向后推 ( B − A + 1 ) (B - A + 1) (BA+1)个位置,减掉即可。
2.若包含,调到取代k的位置。
3.若在右边无效。

#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
using namespace std;
const int MAXN = 2e5 + 5;
int kk, flag[MAXN], m, n;
char s[MAXN];
string ans;
struct node{
	int l, r, c;
	node(){}
	node(int L, int R, int C) {
		l = L;
		r = R;
		c =C;
	}
}a[MAXN];
int main() {
	scanf("%d %d", &kk, &m);
	scanf("%s", s + 1);
	scanf("%d", &n);
	for(int i = 1;i <= n; i++) scanf("%d %d %d", &a[i].l, &a[i].r, &a[i].c);
	for(int k = 1;k <= kk; k++) {
		int now_id = k;
		for(int i = n;i >= 1; i--) {
			if(a[i].c + 1 <= now_id && now_id <= a[i].c + (a[i].r - a[i].l)) {
				int k = now_id - a[i].c - 1;
				now_id = a[i].l + k + 1;
			}
			else if(a[i].c + 1 <= now_id) now_id = now_id - (a[i].r - a[i].l);
		}
		printf("%c", s[now_id]);
	} 
	return 0;
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值