你要和田忌赛马。你们各自有 N 匹马,并且要进行 N 轮比赛,每轮比赛,你们都要各派出一匹马决出胜负。 你的马匹的速度分别为 𝑢 1 , 𝑢 2 , . . . 𝑢 𝑁 ,田忌的马匹的速度分别为 𝑣 1 , 𝑣 2 , 𝑣 𝑁 田忌会按顺序派出他的马匹,请问你要如何排兵布阵,才能赢得最多轮次的比赛?巧合的是,你和田忌的所有马匹的速度两两不同,因此不可能出现 平局 输入 第一行一个整数 。保证 1 <= 𝑁 <= 5 𝑒 4 接下来一行 个用空格隔开的整数,依次为 𝑢 1 , 𝑢 2 , . . . 𝑢 𝑁 ,表示你的马匹们的速度。保证 1 <= 𝑢 𝑖 <= 2 𝑁 接下来一行 个用空格隔开的整数,依次为 𝑣 1 , 𝑣 2 , . . . 𝑣 𝑁 ,表示田忌的马匹们的速度。保证 1 <= 𝑣 𝑖 <= 2 𝑁 输出 输出一行,表示你最多能获胜几轮。 样例输入 复制 3 1 3 5 2 4 6 样例输出 复制 2
这个问题是经典的“田忌赛马”问题。 田忌按顺序出马,你需要安排自己的马匹顺序来最大化获胜轮数。 解题思路 1. 将你和田忌的马的速度分别排序。 2. 使用贪心策略: - 用你最快的马和田忌最快的马比较。 - 如果你的最快马比田忌的最快马快,就赢这一轮,双方去掉最快马。 - 如果你的最快马比田忌的最快马慢,就用你最慢的马去输给田忌的最快马,减少损失。 - 如果你的最快马和田忌的最快马一样快(但题目说速度两两不同,所以不会平局,这里只是逻辑完整),比较最慢的马:如果你的最慢马比田忌的最慢马快,就用最慢马赢他最慢马;否则用最慢马输给田忌的最快马。 不过题目说田忌按顺序出马,而不是田忌也最优安排,所以这里田忌的出马顺序是固定的(\( v_1, v_2, \dots, v_N \))。 你需要安排自己的马匹顺序去应对田忌的固定顺序,以赢得最多轮次。 具体算法 1. 把你的马排序(从小到大)。 2. 用双指针: - 田忌从 \( v_1 \) 到 \( v_N \) 依次出马。 - 对于田忌的每一匹马 \( v_i \),在你的剩余马中选一匹刚好比它快的马(最小的满足 \( u_j > v_i \) 的马)去赢;如果没有比它快的马,就用你剩余最慢的马去输(因为反正赢不了,保留好马后面用)。 但这样直接做是 \( O(N^2) \),需要优化到 \( O(N \log N) \)。 优化方法 用平衡树(如 multiset)存你的马。 对田忌的每一匹马 \( v_i \),在你的 multiset 中找第一个比它大的马(upper_bound),如果有,就选这匹去赢,计数器加一,并删除这匹马;如果没有,就选最小的马去输(删除最小的马)。 这样每作是 \( O(\log N) \),总复杂度 \( O(N \log N) \)。 代码实现 ```cpp #include <iostream> #include <set> #include <vector> #include <algorithm> using namespace std; int main() { int N; cin >> N; vector<int> u(N), v(N); for (int i = 0; i < N; i++) cin >> u[i]; for (int i = 0; i < N; i++) cin >> v[i]; multiset<int> myHorses(u.begin(), u.end()); int winCount = 0; for (int i = 0; i < N; i++) { auto it = myHorses.upper_bound(v[i]); if (it != myHorses.end()) { // 有比 v[i] 快的马,用它赢 winCount++; myHorses.erase(it); } else { // 没有比 v[i] 快的马,用最慢的马输 myHorses.erase(myHorses.begin()); } } cout << winCount << endl; return 0; } ``` 样例验证 输入: ``` 3 1 3 5 2 4 6 ``` 你的马:{1, 3, 5} 田忌出 2 → 选 3 赢(删除 3) 田忌出 4 → 选 5 赢(删除 5) 田忌出 6 → 没有比 6 快的,用 1 输(删除 1) 赢 2 轮,输出 2。 [2026-01-11 12:47:40 | AI问答 | 848点数解答]
- [DeepSeek] 你要和田忌赛马。你们各自有 N 匹马,并且要进行 N 轮比赛,每轮比赛,你们都要各派出一匹马决出胜负。 你的马匹的速度分别为 𝑢 1 , 𝑢 2 , . . . 𝑢 𝑁 ,田忌的马匹的速度分别为 𝑣 1 , 𝑣 2 , 𝑣 𝑁 田忌会按顺序派出他的马匹,请问你要如何排兵布阵,才能赢得最多轮次的比赛?巧合的是,你和田忌的所有马匹的速度两两不同,因此不可能出现 平局 输入 第一行一个整数 。保证 1 <= 𝑁 <= 5 𝑒 4 接下来一行 个用空格隔开的整数,依次为 𝑢 1 , 𝑢 2 , . . . 𝑢 𝑁 ,表示你的马匹们的速度。保证 1 <= 𝑢 𝑖 <= 2 𝑁 接下来一行 个用空格隔开的整数,依次为 𝑣 1 , 𝑣 2 , . . . 𝑣 𝑁 ,表示田忌的马匹们的速度。保证 1 <= 𝑣 𝑖 <= 2 𝑁 输出 输出一行,表示你最多能获胜几轮。 样例输入 复制 3 1 3 5 2 4 6 样例输出 复制 2(848点数解答 | 2026-01-11 12:47:40)25
- [DeepSeek] 通常,人们习惯将所有 位二进制串按照字典序排列,例如所有 2 位二进制串按字典序从小到大排列为:00,01,10,11。 格雷码(Gray Code)是一种特殊的 位二进制串排列法,它要求相邻的两个二进制串间**恰好**有一位**不同**,特别地,第一个串与最后一个串也算作相邻。 所有 2 位二进制串按格雷码排列的一个例子为:00,01,11,10。 位格雷码不止一种,下面给出其中一种格雷码的生成算法: 1. 1 位格雷码由两个 1 位二进制串组成,顺序为:0,1。 2. 位格雷码的前 个二进制串,可以由依此算法生成的 位格雷码(总共 个 位二进制串)按**顺序**排列,再在每个串前加一个前缀 0 构成。 3. 位格雷码的后 个二进制串,可以由依此算法生成的 位格雷码(总共 个 位二进制串)按**逆序**排列,再在每个串前加一个前缀 1 构成。 综上, 位格雷码,由 位格雷码的 个二进制串按顺序排列再加前缀 0,和按逆序排列再加前缀 1 构成,共 个二进制串。另外,对于 位格雷码中的 个 二进制串,我们按上(443点数解答 | 2026-01-05 12:21:49)26
- [字节豆包] 题目描述 最近有 n 个不爽的事,每句话都有一个正整数刺痛值(心理承受力极差)。爱与愁大神想知道连续 m 个刺痛值的和的最小值是多少,但是由于业务繁忙,爱与愁大神只好请你编个程序告诉他。 输入格式 第一行有两个用空格隔开的整数,分别代表 n 和 m。 第 2 到第 (n+1) 行,每行一个整数,第 (i+1) 行的整数 a i 代表第 i 件事的刺痛值 a i 。 输出格式 输出一行一个整数,表示连续 m 个刺痛值的和的最小值是多少。 输入输出样例 输入 #1复制 8 3 1 4 7 3 1 2 4 3 输出 #1复制 6 说明/提示 数据规模与约定 对于 30% 的数据,保证 n≤20。 对于 60% 的数据,保证 n≤100。 对于 90% 的数据,保证 n≤10 3 。 对于 100% 的数据,保证 0≤m≤n≤3×10 3 ,1≤a i ≤100。 用c++语言(241点数解答 | 2025-11-24 19:52:43)66
- [DeepSeek] 题目描述 通常,人们习惯将所有<math xmlns="http://www.w3.org/1998/Math/MathML"> <mi>n</mi> </math> 位二进制串按照字典序排列,例如所有 2 位二进制串按字典序从小到大排列为:00,01,10,11。 格雷码(Gray Code)是一种特殊的 <math xmlns="http://www.w3.org/1998/Math/MathML"> <mi>n</mi> </math> 位二进制串排列法,它要求相邻的两个二进制串间**恰好**有一位**不同**,特别地,第一个串与最后一个串也算作相邻。 所有 2 位二进制串按格雷码排列的一个例子为:00,01,11,10。 <math xmlns="http://www.w3.org/1998/Math/MathML"> <mi>n</mi> </math>位格雷码不止一种,下面给出其中一种格雷码的生成算法: 1. 1 位格雷码由两个 1 位二进制串组成,顺序为:0,1。 2.<math xmlns="http://www.w3.org/1998/Mat(726点数解答 | 2026-01-13 12:31:37)31
- [字节豆包] 题目描述 N N 进制数指的是逢 N N 进一的计数制。例如,人们日常生活中大多使用十进制计数,而计算机底层则一般使用二进制。除此之外,八进制和十六进制在一些场合也是常用的计数制(十六进制中,一般使用字母 A 至 F 表示十至十五;本题中,十一进制到十五进制也是类似的)。 在本题中,我们将给出 个不同进制的数。你需要分别把它们转换成十进制数。 输入格式 输入的第一行为一个十进制表示的整数 N N。接下来 N N 行,每行一个整数 K K,随后是一个空格,紧接着是一个 K K 进制数,表示需要转换的数。保证所有 K K 进制数均由数字和大写字母组成,且不以 0 0 开头。保证 K K 进制数合法。 保证 N ≤ 1000 N≤1000;保证 2 ≤ K ≤ 16 2≤K≤16。 保证所有 K K 进制数的位数不超过 9 9。 输出格式 输出 N N 行,每一个十进制数,表示对应 K K 进制数的十进制数值。(336点数解答 | 2026-01-02 19:45:07)30
- [字节豆包] 给定一个包含 个元素的**整数**序列 ,记作 。 求另一个包含 个元素的待定**整数**序列 ,记 ,使得 且 尽可能的小。 输入 第一行一个整数 ,表示序列元素个数。 第二行 个整数,表示序列 。 输出 一行一个整数,表示 的前提下 的最小值。 样例输入 复制 2 4059 -1782 样例输出 复制 99 提示 对于 的数据, , ,且 序列不全为 来源/分类(746点数解答 | 2026-01-24 13:14:40)30
- [字节豆包] 你要和田忌赛马。你们各自有 N N 匹马,并且要进行 N N 轮比赛,每轮比赛,你们都要各派出一匹马决出胜负。 你的马匹的速度分别为 u 1 , u 2 , ⋯ , u n u 1 ,u 2 ,⋯,u n ,田忌的马匹的速度分别为 v 1 , v 2 , ⋯ , v n v 1 ,v 2 ,⋯,v n 。田忌会按顺序派出他的马匹,请问你要如何排兵布阵,才能赢得最多轮次的比赛?巧合的是,你和田忌的所有马匹的速度两两不同,因此不可能出现平局。 输入格式 第一行一个整数 N N。保证 1 ≤ N ≤ 5 × 10 4 1≤N≤5×10 4 接下来一行 N N 个用空格隔开的整数,依次为 u 1 , u 2 , ⋯ , u n u 1 ,u 2 ,⋯,u n ,表示你的马匹们的速度。保证 1 ≤ u i ≤ 2 N 1≤u i ≤2N。 接下来一行 N N 个用空格隔开的整数,依次为 v 1 , v 2 , ⋯ , v n v 1 ,v 2 ,⋯,v (430点数解答 | 2026-01-10 20:35:40)26
- [字节豆包] 小 L 和小 Q 在玩一个策略游戏。 有一个长度为 的数组 和一个长度为 的数组 ,在此基础上定义一个大小为 的矩阵 ,满足 。所有下标均从 开始。 游戏一共会进行 轮,在每一轮游戏中,会事先给出 个参数 ,满足 、 。 游戏中,小 L 先选择一个 之间的下标 ,然后小 Q 选择一个 之间的下标 。定义这一轮游戏中二人的得分是 。 小 L 的目标是使得这个得分尽可能大,小 Q 的目标是使得这个得分尽可能小。同时两人都是足够聪明的玩家,每次都会采用最优的策略。 请问:按照二人的最优策略,每轮游戏的得分分别是多少? 【数据范围】 对于所有数据, , 。对于每轮游戏而言, , 。 输入 第一行输入三个正整数 ,分别表示数组 ,数组 的长度和游戏轮数。 第二行: 个整数,表示 ,分别表示数组 的元素。 第三行: 个整数,表示 ,分别表示数组 的元素。 接下来 行,每行四个正整数,表示这一次游戏的 。 输出 输出共 行,每行一个整数,分别表示每一轮游戏中,小 L 和小 Q 在最优策略(676点数解答 | 2025-12-12 18:49:42)49
- [DeepSeek] 1212: 幂次方 内存限制:128 MB 时间限制:1.000 S 评测方式:文本比较 命题人:外部导入 提交:38 解决:23 题目描述 任何一个正整数都可以用 的幂次方表示。例如 。 同时约定方次用括号来表示,即 可表示为 。 由此可知, 可表示为 进一步: ( 用 表示),并且 。 所以最后 可表示为 。 又如 所以 最后可表示为 。 输入 一行一个正整数 。 输出 符合约定的 的 表示(在表示中不能有空格)。 样例输入 复制 1315 样例输出 复制 2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0) 提示 **【数据范围】** 对于 的数据, 。(212点数解答 | 2026-01-05 12:17:36)26
- [百度文心] c++描述 一天,一个画家在森林里写生,突然爆发了山洪,他需要尽快返回住所中,那里是安全的。 森林的地图由R行C列组成,空白区域用点“.”表示,洪水的区域用“*”表示,而岩石用“X”表示,另画家的住所用“D”表示,画家用“S”表示。 有以下几点需要说明: 1.每一分钟画家能向四个方向移动一格(上、下、左、右)。 2.每一分钟洪水能蔓延到四个方向的相邻格子(空白区域)。 3.洪水和画家都不能通过岩石区域。 4.画家不能通过洪水区域(同时也不行,即画家不能移到某个格子,该格子在画家达到的同时被洪水蔓延到了,这也是不允许的)。 5. 洪水蔓不到画家的住所。 给你森林的地图,编写程序输出最少需要花费多长时间才能从开始的位置赶回家中。 输入描述 输入第一行包含两个整数R和C(R,C<=50)。 接下来R行每行包含C个字符(“.”、“*”、“X”、“D”或“S”)。 地图保证只有一个“D”和一个“S”。 输出描述 输出画家最快安全到达住所所需的时间,如果画家不可能安全回家则输出“KAKTUS”。 用例输入 1 3 3 D.* ... .S. 用例输出 1 (1384点数解答 | 2025-03-16 17:33:49)377
- [字节豆包] n 个人站一队(n >= 3),编号依次是 1 ~ n, 他们每个人手里都有若干个苹果。 1 号把自己手里的苹果尽量平均地分成两份,如果两份数量相等,则任选一份传递给 2 号;如果数量不等,则选择数量较少的一份传给 2 号。 2 ~ n - 1 号在接受了别人的苹果之后,都这样操作: 把自己手里的苹果尽量平均地分成两份,如果两份数量相等,则任选一份传递给下一个人;如果数量不等,则选择数量较少的一份传给下一个人。 请问,传递结束后,n 号手里有多少苹果? 输入 一行,若干个整数,以空格分开,表示 1 ~ n 号人手里苹果的数量 输出 一个正整数,表示 n 号手里的苹果数量(352点数解答 | 2025-12-20 20:39:38)28
- [阿里通义] 一个 5×6 的迷宫样例如下: 要求给出从起点(1,1)到终点(3,4)的路径。 为了处理方便,保证最外圈全都为障碍物。 扩展到一般情况,一个 m×n 的迷宫,要求输出从起点(1,1)到终点(m-2,n-2)的路径。 测试实例保证路径是唯一的。 该题要求自行设计一个栈来做。如果设计的是顺序栈,则保证栈的大小不超过 200 个元素。 输入 第一行为两个整数 m 和 n,表示 m×n 的迷宫。 接下来有 m 行,每行有 n 个数(n 个数之间用空格间隔,值 = 0 表示可以通行,值 = 1 表示为障碍物) 输出 输出从起点到终点的路径,每个坐标占一行,坐标间的行号和列号用一个空格间隔。具体格式可参考样例。c++ 源代码(732点数解答 | 2024-11-03 02:34:53)498