找的好辛苦

先到一些网站找(见前篇), 然后到一些大学找, 然后到goolge搜。

留着纪念。

关键字查找: project idea linux

其他关键字还有linux project proposal idea, 好好组合吧。

偶尔travian走走神;) 

缺失的页码 时间限制: 10s 类别: 一维数组->较难 问题描述 明明在一家图书馆里工作,他的主要任务是修补缺损的图书。有一次,图书馆里面收到一大批损坏的图书,这些图书有一个特点,每本书页码的编排方式为:(1,2)(3,4)(5,6)……,括号内数字指一张纸的正反两页,每本书都只少了其中的一张书纸,然后还知道剩下的各页码之和是多少。明明现在的主要工作是把那张缺失的页到,然后再补进一张,这样就完成了图书的修补工作。但是明明发现,这并不是一件很轻松就可以完成的事情,因为有些书非常厚,无法立刻到缺失的那一张。于是明明只能从头开始,一张一张的翻阅图书,直至到那一张缺失的页为止,这样的工作效率显然是非常低的。 你是一名程序设计专家,同时也是明明的好朋友,你看到明明如此辛苦的工作,就萌发了帮助明明的想法,你问明明能不能把书的页码和(缺失一张纸后的书的页码之和)告诉你,明明说:“当然没问题”,于是就把页码和告诉了你。你得到了页码和后,就写了一个程序,利用程序,很快就算出了缺失的那页纸的页码是多少,并得到了完整的页码总和,这样就极大地帮助了明明,使他的工作很快就完成了,明明也因此请你吃了顿饭,感谢你对他的帮助。 明明的问题可以归结为:一本书,中间少了一张纸,剩下的各页码之和为S。已知每张纸有两个相邻页码,编排方式为:(1,2)(3,4)(5,6)……,括号内数字指一张纸的正反两页。你的任务是对于输入的S,求这本书原来的总页数T,以及少掉的那两页的页数,A和B。如果不到缺失的页码,则输出Impossible。 输入说明 你写的程序要求从标准输入设备中读入测试数据作为你所写程序的输入数据。标准输入设备中有多组测试数据,每组测试数据仅占一行,每行仅包括一个正整数S(1≤S≤5050),代表书的页码总和。当S=0的时候,表示输入结束。每组测试数据与其后一组测试数据之间没有任何空行,第一组测试数据前面以及最后一组测试数据后面也都没有任何空行。 输出说明 对于每一组测试数据,你写的程序要求计算出一组相应的运算结果,并将这一组运算结果作为你所写程序的输出数据依次写入到标准输出设备中。每组运算结果为三个整数T、A、B,整数之间用一个空格隔开,三个整数分别表示书完整的页码总和和缺失的那一张书纸的正反面两个页码。每组运算结果单独形成一行数据,其行首和行尾都没有任何空格,每组运算结果与其后一组运算结果之间没有任何空行,第一组运算结果前面以及最后一组运算结果后面也都没有任何空行。 注:通常,显示屏为标准输出设备。 输入范例 9 10 0 输出范例 Impossible 6 5 6
最新发布
09-22
### 题目重述 一本书的页码按每张纸正反面排列为:(1,2), (3,4), (5,6), ...,即每张纸包含两个连续页码,前奇后偶。 现在这本书**恰好丢失了一张纸**,剩余页码之和为 $ S $。 给定 $ S $,求: - 原书完整的总页数 $ T $ - 丢失的那张纸的两个页码 $ A $ 和 $ B $($ A < B $) 若无法满足条件,则输出 `Impossible`。 输入以 $ S = 0 $ 结束。 --- ### 详解 #### 核心思路: 设原书共有 $ n $ 张纸 → 总页数为 $ T = 2n $,完整页码和为: $$ \text{Total} = \sum_{i=1}^{2n} i = \frac{2n(2n + 1)}{2} = n(2n + 1) $$ 丢失一张纸,其两页为 $ x $ 和 $ x+1 $(且 $ x $ 为奇数),它们的和为 $ x + (x+1) = 2x + 1 $ 则剩余页码和: $$ S = \text{Total} - (2x + 1) \Rightarrow \text{Total} = S + (2x + 1) $$ 我们枚举可能的 $ n $(即纸张总数),计算对应 $ \text{Total} = n(2n + 1) $,然后检查差值 $ \text{Total} - S $ 是否等于某个合法的“丢失页码对”的和(即形如 $ 2x+1 $,其中 $ x $ 为奇数,且 $ x \leq 2n-1 $)。 但更高效的方法是: 由于 $ S \leq 5050 $,而 $ 1+2+\cdots+100 = 5050 $,所以最大可能的总页数不超过 100 → 即最多 $ n = 50 $ 张纸。 我们可以**从小到大枚举可能的总页数 $ T = 2n $**,直到 $ \text{Total} \geq S $,并判断是否可能。 #### 算法步骤: 1. 枚举总张数 $ n $ 从 1 到 50: - 计算总页数 $ T = 2n $ - 完整页码和 $ \text{Total} = n(2n + 1) $ - 缺失页码和应为 $ \text{missing} = \text{Total} - S $ - 若 $ \text{missing} < 3 $ 或 $ \text{missing} > (T-1)+T = 4n - 1 $ → 跳过 - 检查 $ \text{missing} $ 是否能表示为两个连续页码之和,且第一页为奇数: - 设 $ x = (\text{missing} - 1)/2 $,则两页为 $ x $ 和 $ x+1 $ - 必须满足:$ x $ 是奇数?不!关键:$ x $ 必须是**奇数**,因为每张纸正面是奇数页。 - 所以要求: - $ \text{missing} $ 为奇数(因为 $ 2x+1 $ 是奇数) - $ x = (\text{missing} - 1)/2 $ 为奇数 - $ x \geq 1 $ 且 $ x+1 \leq T $ 2. 如果到唯一一组满足条件的 $ (n, x) $,输出 $ T=2n, A=x, B=x+1 $ 3. 若没有到 → 输出 `Impossible` 注意:题目隐含假设只缺一张纸,且一定在某个合理的书中存在。 --- ### 代码解析 ```cpp #include <iostream> using namespace std; int main() { int S; while (cin >> S && S != 0) { bool found = false; int result_T = 0, result_A = 0, result_B = 0; // 枚举纸张数量 n(即多少张纸) for (int n = 1; n <= 50; ++n) { int T = 2 * n; // 最大页码 int Total = n * (2 * n + 1); // 1 到 2n 的和 if (Total <= S) continue; // 缺失后不可能比原来大 int missing = Total - S; // 缺失页码和必须是两个连续数之和:x + (x+1) = 2x+1 => 奇数 if (missing % 2 == 0) continue; int x = (missing - 1) / 2; // 得到较小页码 int y = x + 1; // 检查 x 是否为奇数(每张纸第一页是奇数),且页码在范围内 if (x >= 1 && y <= T && x % 2 == 1) { // 合法的缺失页码对 result_T = T; result_A = x; result_B = y; found = true; break; // 题意中只少一张,取最小合理解即可 } } if (found) { cout << result_T << " " << result_A << " " << result_B << endl; } else { cout << "Impossible" << endl; } } return 0; } ``` #### 示例分析: - 输入 $ S = 9 $: - 尝试 $ n=3 $: $ T=6 $, $ \text{Total}=3×7=21 $, $ \text{missing}=12 $ → 偶数 → 不行 - $ n=2 $: $ T=4 $, $ \text{Total}=2×5=10 $, $ \text{missing}=1 $ → $ x=0 $ → 无效 - $ n=1 $: $ T=2 $, $ \text{Total}=1×3=3 < 9 $ → 不行 - 所有都不行 → `Impossible` - 输入 $ S = 10 $: - 尝试 $ n=3 $: $ \text{Total}=21 $, $ \text{missing}=11 $ - $ x=(11-1)/2=5 $, $ y=6 $, $ x $ 是奇数,且 $ 5≤6 $ - 合法 → 输出 $ T=6, A=5, B=6 $ 正确匹配输出范例。 --- ### 知识点 - **等差数列求和**:完整页码和可用公式 $ \frac{T(T+1)}{2} $ 或按张推导。 - **数学建模与逆推**:由剩余和反推原始和与缺失部分,结合结构约束求解。 - **奇偶性分析**:每张纸页码为(奇, 偶),其和必为奇数,可用于剪枝判断。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值