【基础】Even More Odd Photos 显示标签 时间限制:C/C++ 1000MS,其他语言 2000MS 内存限制:C/C++ 128MB,其他语言 256MB 难度:基础 分数:100 OI排行榜得分:14(0.1*分数+2*难度) 出题人: 描述 Farmer John 正再一次尝试给他的 N 头奶牛拍照(2≤N≤1000)。 每头奶牛有一个范围在 1…100 之内的整数的「品种编号」。Farmer John 对他的照片有一个十分古怪的构思:他希望将所有的奶牛分为不相交的若干组(换句话说,将每头奶牛分到恰好一组中)并将这些组排成一行,使得第一组的奶牛的品种编号之和为偶数,第二组的编号之和为奇数,以此类推,奇偶交替。 Farmer John 可以分成的最大组数是多少? 输入描述 输入的第一行包含 N。下一行包含 N 个空格分隔的整数,为 N 头奶牛的品种编号。 输出描述 输出 Farmer John 的照片中的最大组数。可以证明,至少存在一种符合要求的分组方案。 用例输入 1 7 1 3 5 7 9 11 13 用例输出 1 3 提示 输入
```cpp #include <iostream> #include <vector> using namespace std; // 检查是否可以分成指定数量的组 bool canPartition(const vector<int>& cows, int numGroups) { int n = cows.size(); // dp[i][j][k] 表示前 i 头奶牛,分成 j 组,当前组的和的奇偶性为 k(0 为偶数,1 为奇数)是否可行 vector<vector<vector<bool>>> dp(n + 1, vector<vector<bool>>(numGroups + 1, vector<bool>(2, false))); dp[0][0][0] = true; for (int i = 1; i <= n; ++i) { for (int j = 0; j <= numGroups; ++j) { for (int k = 0; k < 2; ++k) { // 情况 1:不开始新的组,继续当前组 if (j > 0) { dp[i][j][k ^ (cows[i - 1] % 2)] = dp[i][j][k ^ (cows[i - 1] % 2)] || dp[i - 1][j][k]; } // 情况 2:开始新的组 if (j > 0) { dp[i][j][cows[i - 1] % 2] = dp[i][j][cows[i - 1] % 2] || dp[i - 1][j - 1][1 - k]; } } } } // 检查分成 numGroups 组,最后一组的奇偶性是否符合要求 return dp[n][numGroups][(numGroups - 1) % 2]; } int main() { int n; cin >> n; vector<int> cows(n); for (int i = 0; i < n; ++i) { cin >> cows[i]; } // 二分查找最大组数 int left = 1, right = n; int result = 1; while (left <= right) { int mid = left + (right - left) / 2; if (canPartition(cows, mid)) { result = mid; left = mid + 1; } else { right = mid - 1; } } cout << result << endl; return 0; } ``` 代码解释 1. `canPartition` 函数: - 该函数用于检查是否可以将奶牛分成指定数量的组。 - 使用三维动态规划数组 `dp[i][j][k]` 来记录前 `i` 头奶牛,分成 `j` 组,当前组的和的奇偶性为 `k`(0 为偶数,1 为奇数)是否可行。 - 对于每头奶牛,有两种选择:不开始新的组,继续当前组;或者开始新的组。 - 最后检查分成指定数量的组,最后一组的奇偶性是否符合要求。 2. `main` 函数: - 读取输入的奶牛数量和每头奶牛的品种编号。 - 使用二分查找来找到最大的组数。 - 调用 `canPartition` 函数来检查是否可以分成指定数量的组。 - 输出最大的组数。 复杂度分析 - 时间复杂度:$O(n^2)$,其中 $n$ 是奶牛的数量。 - 空间复杂度:$O(n^2)$,主要用于动态规划数组。 [2026-02-03 15:18:32 | AI问答 | 841点数解答]
- [字节豆包] 【基础】Even More Odd Photos 显示标签 时间限制:C/C++ 1000MS,其他语言 2000MS 内存限制:C/C++ 128MB,其他语言 256MB 难度:基础 分数:100 OI排行榜得分:14(0.1*分数+2*难度) 出题人: 描述 Farmer John 正再一次尝试给他的 N 头奶牛拍照(2≤N≤1000)。 每头奶牛有一个范围在 1…100 之内的整数的「品种编号」。Farmer John 对他的照片有一个十分古怪的构思:他希望将所有的奶牛分为不相交的若干组(换句话说,将每头奶牛分到恰好一组中)并将这些组排成一行,使得第一组的奶牛的品种编号之和为偶数,第二组的编号之和为奇数,以此类推,奇偶交替。 Farmer John 可以分成的最大组数是多少? 输入描述 输入的第一行包含 N。下一行包含 N 个空格分隔的整数,为 N 头奶牛的品种编号。 输出描述 输出 Farmer John 的照片中的最大组数。可以证明,至少存在一种符合要求的分组方案。 用例输入 1 7 1 3 5 7 9 11 13 用例输出 1 3 提示 输入(841点数解答 | 2026-02-03 15:18:32)5
- [字节豆包] 【提高】Comfortable Cows 显示标签 时间限制:C/C++ 1000MS,其他语言 2000MS 内存限制:C/C++ 128MB,其他语言 256MB 难度:提高 分数:100 OI排行榜得分:18(0.1*分数+2*难度) 出题人: 描述 Farmer Nhoj 的草地可以被看作是一个由正方形方格组成的巨大的二维方阵(想象一个巨大的棋盘)。初始时,草地上是空的。 Farmer Nhoj 将会逐一地将 NN(1≤N≤105)头奶牛加入到草地上。第 ii 头奶牛将会占据方格 (xi,yi),不同于所有已经被其他奶牛占据的方格(0≤xi,yi≤1000)。 一头奶牛被称为是「舒适的」,如果它水平或竖直方向上与恰好三头其他奶牛相邻。然而,太舒适的奶牛往往产奶量落后,所以 Farmer Nhoj 想要额外加入一些奶牛直到没有奶牛(包括新加入的奶牛)是舒适的。注意加入的奶牛的 xx 和 yy 坐标并不一定需要在范围 0…1000内。 对于 1…N 中的每个 i,输出当初始时草地上有奶牛 1…i 时,Farmer Nhoj 为使得没有奶牛舒适,需要加入的奶牛的最小数量。(956点数解答 | 2026-02-02 17:26:13)7
- [字节豆包] 【NOIP2014 基础】螺旋矩阵 显示标签 时间限制:C/C++ 1000MS,其他语言 2000MS 内存限制:C/C++ 128MB,其他语言 256MB 难度:提高 分数:100 OI排行榜得分:18(0.1*分数+2*难度) 出题人: 描述 一个 n 行 n 列的螺旋矩阵可由如下方法生成: 从矩阵的左上角(第 1 行第 1 列)出发,初始时向右移动;如果前方是未曾经过的格子,则继续前进,否则右转;重复上述操作直至经过矩阵中所有格子。根据经过顺序,在格子中依次填入 1,2,3,...,n 2 ,便构成了一个螺旋矩阵。 下图是一个 n=4 时的螺旋矩阵。 ⎝ ⎜ ⎜ ⎜ ⎛ 1 12 11 10 2 13 16 9 3 14 15 8 4 5 6 7 ⎠ ⎟ ⎟ ⎟ ⎞ 现给出矩阵大小 n 以及 i 和 j,请你求出该矩阵中第 i 行第 j 列的数是多少。 输入描述 共一行,包含三个整数 n, i, j,每两个整数之间用一个空格隔开,分别表示矩阵大小、待求的数所在的行号和列号。 输出描述 一个整数,表(289点数解答 | 2026-02-02 17:32:56)6
- [字节豆包] 发现它,抓住它 显示标签 时间限制:C/C++ 1000MS,其他语言 2000MS 内存限制:C/C++ 256MB,其他语言 512MB 难度:基础 分数:100 OI排行榜得分:14(0.1*分数+2*难度) 出题人: 描述 一个城市中有两个犯罪团伙A和B,你需要帮助警察判断任意两起案件是否是同一个犯罪团伙所为,警察所获得的信息是有限的。假设现在有N起案件(N<=100000),编号为1到N,每起案件由团伙A或团伙B所为。你将按时间顺序获得M条信息(M<=100000),这些信息分为两类: D [a] [b] 其中[a]和[b]表示两起案件的编号,这条信息表明它们属于不同的团伙所为 A [a] [b] 其中[a]和[b]表示两起案件的编号,这条信息需要你回答[a]和[b]是否是同一个团伙所为 注意你获得信息的时间是有先后顺序的,在回答的时候只能根据已经接收到的信息做出判断。 输入描述 第一行是测试数据的数量T(1<=T<=20)。 每组测试数据的第一行包括两个数N和M,分别表示案件的数量和信息的数量,其后M行表示按时间顺序收到的M条信息。 输出描述 对于每条需要回答(894点数解答 | 2026-02-02 17:28:01)7
- [字节豆包] #include <iostream> using namespace std; int main() { int n; cin >> n; if ( ) { if ( ) { cout << } else { cout << } } else { if ( ) { cout << } else { cout << } } return 0; }输入n,判断n是否为奇数,是否大于100。 如果n是奇数,并且n>100,输出"Odd and Large"。 如果n是奇数,并且n<=100,输出"Odd and Small"。 如果n是偶数,并且n>100,输出"Even and Large"。 如果n是偶数,并且n<=100,输出"Even and Small"。 输入: 一个整数n。 输出: 如题目描述。 输入样例1: 108 输出样例1: Even and Large 输入样例2: 99 输出样例2: Odd and Smal(189点数解答 | 2025-12-13 20:11:55)45
- [DeepSeek] 输入n,判断n是否为奇数,是否大于100。 如果n是奇数,并且n>100,输出"Odd and Large"。 如果n是奇数,并且n<=100,输出"Odd and Small"。 如果n是偶数,并且n>100,输出"Even and Large"。 如果n是偶数,并且n<=100,输出"Even and Small"。 输入: 一个整数n。 输出: 如题目描述。 输入样例1: 108 输出样例1: Even and Large 输入样例2: 99 输出样例2: Odd and Small 使用c++语音(123点数解答 | 2025-12-28 14:53:27)33
- [字节豆包] 【NOIP2015 基础】扫雷游戏(mine) 显示标签 时间限制:C/C++ 1000MS,其他语言 2000MS 内存限制:C/C++ 256MB,其他语言 512MB 难度:提高 分数:100 OI排行榜得分:18(0.1*分数+2*难度) 出题人: 描述 扫雷游戏是一款十分经典的单机小游戏。在 n行 m 列的雷区中有一些格子含有地雷(称之为地雷格),其他格子不含地雷(称之为非地雷格)。玩家翻开一个非地雷格时,该格将会出现一个数字——提示周围格子中有多少个是地雷格。游戏的目标是在不翻出任何地雷格的条件下,找出所有的非地雷格。 现在给出n行m列的雷区中的地雷分布,要求计算出每个非地雷格周围的地雷格数。 注:一个格子的周围格子包括其上、下、左、右、左上、右上、左下、右下八个方向上与之直接相邻的格子。 输入描述 输入文件第一行是用一个空格隔开的两个整数n和m,分别表示雷区的行数和列数。 接下来 n行,每行m 个字符,描述了雷区中的地雷分布情况。字符’*’表示相应格子是地雷格,字符’?’表示相应格子是非地雷格。相邻字符之间无分隔符。 输出描述 输出文件包含 n 行,每行 m(545点数解答 | 2026-02-02 17:34:02)10
- [字节豆包] [USACO6.1]邮车 Postal Vans 显示标签 时间限制:C/C++ 1000MS,其他语言 2000MS 内存限制:C/C++ 256MB,其他语言 512MB 难度:普及 分数:100 OI排行榜得分:16(0.1*分数+2*难度) 出题人: 描述 郊区呈矩形,有四条东西方向的街道和N(1<=N<=1000)条南北方向的街道。 在郊区的西北角有一个邮局。 如N=5时,郊区如下图所示,圆点表示邮局,直线表示街道。 每天邮政卡车从邮局出发,每个十字路口(包括边界和四角)经过且只经过一次。现在邮局希望知道邮政货车行驶的路线有几种。 例如,下面两幅图表示的是满足上图的两条路线 另一个例子,下面四幅图表示了当N=3时的全部四种情况 。 输入描述 一行:一个数值N 。 输出描述 一行: 到INPUT中给出的街道的路径总数 。 用例输入 1 4 用例输出 1 12 c++(448点数解答 | 2026-02-03 15:19:59)7
- [字节豆包] 提高】卫星照片 USACO 显示标签 时间限制:C/C++ 1000MS,其他语言 2000MS 内存限制:C/C++ 128MB,其他语言 256MB 难度:普及 分数:100 OI排行榜得分:16(0.1*分数+2*难度) 出题人: 描述 农夫约翰总是想要一个农场的地图,所以他拍摄了一张N行M列的卫星照片。一部分的照片看起来像这样: .................. ..#####.......##.. ..#####......##... .................. #.......###.....#. #.....#####....... 他认为每个联通块都是一个谷仓或一头奶牛。联通块由若干个彼此水平或垂直相邻的#符号组成。以下的照片被认为是两个联通块: .... .#.. ..#. .... 农夫约翰认为一个联通块是谷仓,当且仅当它是一个完整的矩形,否则该联通块是一头奶牛。在第一张照片上面,有三个谷仓(大小分别为2x1,2x5和1x1)和两头奶牛。 计算他的卫星照片中谷仓和奶牛的数量。 输入描述 行1:两个空格分隔的整数:N和M(N,M<=80)。(850点数解答 | 2026-02-03 17:15:10)7
- [字节豆包] 【基础】高精度减法3 显示标签 时间限制:C/C++ 1000MS,其他语言 2000MS 内存限制:C/C++ 16MB,其他语言 32MB 难度:GESP4+/普及- 分数:0 OI排行榜得分:12(0.1*分数+2*难度) 出题人: 描述 处理两个高精度数的减法。(1000位内) 输入描述 两行,每行一个整数。(可能为负数,负号用“-”表示) 输出描述 一个整数,即两个数相减的结果。 用例输入 1 2345678901234 *********012345 用例输出 1 -121111110111111 提示 注意:输入的数可能是负数! 来源 高精度算法(687点数解答 | 2026-01-03 18:40:48)24
- [字节豆包] 例7.2】与圆相关的计算 显示标签 时间限制:C/C++ 1000MS,其他语言 2000MS 内存限制:C/C++ 64MB,其他语言 128MB 难度:入门 分数:100 OI排行榜得分:12(0.1*分数+2*难度) 出题人: 描述 给出圆的半径,求圆的直径、周长和面积。 如果圆的半径是 r,那么圆的直径、周长、面积分别是2×r、2×π×r、π×r×r,其中约定π=3.14159。 输入描述 输入包含一个实数r(0<r≤10,000),表示圆的半径。 输出描述 输出一行,包含三个数,分别表示圆的直径、周长、面积,数与数之间以一个空格分开,每个数保留 4 位小数。 用例输入 1 3.0 用例输出 1 6.0000 18.8495 28.2743 来源 http://bas.ssoier.cn:8086/problem_show.php?pid=3028 顺序结构c++(382点数解答 | 2026-02-02 17:41:00)7
- [字节豆包] 【例78.3】回文数(Noip1999) 显示标签 时间限制:C/C++ 1000MS,其他语言 2000MS 内存限制:C/C++ 64MB,其他语言 128MB 难度:提高 分数:100 OI排行榜得分:18(0.1*分数+2*难度) 出题人: 描述 若一个数(首位不为零)从左向右读与从右向左读都是一样,我们就将其称之为回文数。例如:给定一个 10进制数 56,将 56加 65(即把56从右向左读),得到 121是一个回文数。又如,对于10进制数87, STEP1: 87+78=165 STEP2: 165+561=726 STEP3: 726+627=1353 STEP4: 1353+3531=4884 在这里的一步是指进行了一次N进制的加法,上例最少用了4步得到回文数4884。 写一个程序,给定一个N(2<N≤10或N=16)进制数 M.求最少经过几步可以得到回文数。如果在30步以内(包含30步)不可能得到回文数,则输出“Impossible” 。 输入描述 第1行,给定一个N(2<N≤10或N=16)表示进制; 第2行,一个N进制数M。 输出描述 最少几步。如果(811点数解答 | 2026-02-02 17:44:17)8