B. Restoring Painting CodeForces - 675B

本文解析了在CodeForces问题675/B中,小V如何通过枚举中间数确定3x3正方形填数游戏的剩余数种类,关键在于分析四周数的范围和最大最小值。解决策略涉及计算和限制条件,最终给出了求解次数的算法实现。

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

原题链接 位于CodeForcesicon-default.png?t=M1L8https://codeforces.com/problemset/problem/675/B

翻译

小 V 在玩填数游戏,游戏在 3×3 的正方形中进行。

  • 9 个格子中的数字都为 1∼n 的整数,不同格子中的数字可以相同。
  • 正方形可以划分出 4 个 2×2 的小正方形,这四个正方形中的数之和相同。
  • 如图所示,a, b, c, d 的值是已知的。


 
现在 小 V 想知道,剩下的 5 个数一共有多少种填法。

题意及思路

可以很容易得到,四周数字的填写与中间数字无关,因而我们枚举中间数 e 为1~n

所以可以知道每次枚举e时,a,b,c,d,e是固定值,因而四周数的相对差是相同的

所以根据n的大小得出四周数的范围,因为四个方块的和相同,则与:a+b, a+c, b+d, c+d有关

经过分析,四周数的范围与其中的 最大值max 与 最小值min 有关

范围大小是最大和减最小和加一,可以得出每次枚举的四周数范围为n-(max-min+1)+1

因为我们知道当差值过大以至于大于n时没有答案,所以每次枚举结果为max(n-(max-min+1)+1, 0)

因为枚举中间数, 所以次数即为n,答案为 n * max(n-(max-min+1)+1, 0)

#include <bits/stdc++.h>
using namespace std;

int main()
{
	int i, j, t;
	int a, b, c, d;
	long long n;

	scanf("%lld%d%d%d%d", &n, &a, &b, &c, &d);
	int xmax = max(max(a+b, a+c),max(b+d, c+d));
	int xmin = min(min(a+b, a+c),min(b+d, c+d));
	printf ("%lld", n * max<long long>(n - (xmax - xmin + 1) + 1, 0));
                        // 此处需用“longlong的max”,因为答案包含longlong数

	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值