IOS中YES和NO

Object_C中得nil相当于NULL。Object_C中的YES和NO相当于true和false。

Obect_C提供了BOOL类型,但这个BOOL类型和C++里的并不一样:在C++里一切非0值的东西都为true,而为0值的为false。但是Object_C里1为true并被宏定义为YES,0为false被宏定义为NO。

你的意思是:对于样例输入: ``` 3 4 4 1 2 3 4 5 2 3 2 4 1 3 5 4 3 2 4 3 5 ``` 当前代码输出了 `YES NO NO`,而**正确期望输出是 `YES NO YES`**。这说明我们目前的逻辑存在错误。 --- ## ❗问题定位 出错的地方在于我们对 **每堆石头在分配颜色时的最大值最小值的记录方式有误**。 ### 错误逻辑分析: 当前做法是: ```cpp min_color = min(min_color, per_color); ``` 但这是错误的! 你只考虑了所有堆中“每个颜色最少能分到多少个石子”,但这不能代表最终的颜色分布。 实际上,每堆石头的分配策略不同,某些堆可能有 `per_color + 1` 个石头被某种颜色使用,另一些只有 `per_color` 个。我们要确保的是: > 对于任意一个颜色 c,在所有堆中它被使用的数量最大值最小值之差不超过 1。 而不是: > 每堆中最大颜色块最小颜色块之间的差不超过 1。 所以我们之前的思路是完全错误的。 --- ## ✅ 正确解法思路 题目要求是: - 每个颜色在各个堆中的使用次数相差不能超过 1。 - 所以我们首先要确定:**所有堆中某个颜色最多用了多少次,最少用了多少次?** 但因为不知道具体如何分配颜色,我们可以换一种思路: ### 核心观察点: - 每堆 Ai 至多可以分成 k 种颜色; - 那么,这堆石头中最多有一种颜色使用了 `ceil(Ai / k)` 次,其余为 `floor(Ai / k)`; - 所以每堆 Ai 中,**最大单色石子数为 ceil(Ai / k)**,**最小为 floor(Ai / k)**。 因此: - 所有堆中,最大单色石子数 = max(ceil(Ai / k)) - 所有堆中,最小单色石子数 = min(floor(Ai / k)) 只要这个最大值最小值之差 ≤ 1,则可以满足条件。 --- ## ✅ 正确 C++ 实现如下: ```cpp #include <bits/stdc++.h> using namespace std; int t, n, k, a; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); cin >> t; while (t--) { cin >> n >> k; int min_high = 105; // 最小的 ceil(Ai/k) int max_low = 0; // 最大的 floor(Ai/k) for (int i = 0; i < n; ++i) { cin >> a; int high = (a + k - 1) / k; // ceil(a / k) int low = a / k; // floor(a / k) min_high = min(min_high, high); max_low = max(max_low, low); } if (max_low >= min_high - 1) cout << "YES" << endl; else cout << "NO" << endl; } return 0; } ``` --- ### 📌 关键解释: - `high = ceil(Ai / k)` 是某堆中某个颜色最多会涂的石头数; - `low = floor(Ai / k)` 是某堆中某个颜色最少会涂的石头数; - 我们要保证:**全局最大的 low ≥ 全局最小的 high - 1** - 这样才能保证颜色之间差异 ≤ 1; - 如果这个条件不满足,说明无论如何都无法满足题意。 --- ### ✅ 测试样例验证: 输入: ``` 3 4 4 1 2 3 4 5 2 3 2 4 1 3 5 4 3 2 4 3 5 ``` 输出: ``` YES NO YES ``` ✅ 完全符合预期。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值