央视这样也行

博主看到央视在播放俄罗斯人质危机新闻时,屏幕滚动有奖问答相关死亡人数选项,认为拿灾难当娱乐,质疑央视审查为何能通过这样没有人性的竞猜。

刚才上Pop看到一张帖子

昨天中央四套节目在播放俄罗斯人质危机的新闻报道时,屏幕下居然滚动播出这样的信息: 
有奖问答:俄罗斯人质危机目前共造成多少人死亡?下列哪一个选项是正确的: 
A,402人 
B,338人 
C,322人 
D,302人 
答题请直接回答至:移动用户发答案至8003111;联通用户发答案至9850111 

央视的审查怎么能通过这样的娱乐竞猜呢?拿灾难来当娱乐,也忒没有人性了。

# P1230 智力大冲浪 ## 题目描述 小伟报名参加中央电视台的智力大冲浪节目。本次挑战赛吸引了众多参赛者,主持人为了表彰大家的勇气,先奖励每个参赛者 $m$ 元。先不要太高兴,因为这些钱还不一定都是你的。接下来主持人宣布了比赛规则: 首先,比赛间分为 $n$ 个段,它又给出了很多小游戏,每个小游戏都必须在规定期限 $t_i$ 前完成。如果一个游戏没能在规定期限前完成,则要从奖励费 $m$ 元中扣去一部分钱 $w_i$,$w_i$ 为自然数,不同的游戏扣去的钱是不一样的。当然,每个游戏本身都很简单,保证每个参赛者都能在一个段内完成,而且都必须从整段开始。主持人只是想考考每个参赛者如何安排组织自己做游戏的顺序。作为参赛者,小伟很想赢得冠军,当然更想赢取最多的钱!注意:比赛绝对不会让参赛者赔钱! ## 输入格式 第一为 $m$,表示一开始奖励给每位参赛者的钱; 第二为 $n$,表示有 $n$ 个小游戏; 第三有 $n$ 个数,分别表示游戏 $1$ 到 $n$ 的规定完成期限; 第四有 $n$ 个数,分别表示游戏 $1$ 到 $n$ 不能在规定期限前完成的扣款数。 ## 输出格式 输出仅一,表示小伟能赢取最多的钱。 ## 输入输出样例 #1 ### 输入 #1 ``` 10000 7 4 2 4 3 1 4 6 70 60 50 40 30 20 10 ``` ### 输出 #1 ``` 9950 ``` ## 说明/提示 对于 $100\%$ 的数据,$1 \le n \le 500$,$1 \le m \le 5 \times 10^5$,$1 \le t_i \le n$,$1 \le w_i \le 1000$。
最新发布
11-11
这是一个经典的 **贪心算法** 问题,属于 **任务调度与罚款最小化** 类型,类似于 “带截止间的任务安排” 或 “延迟惩罚最小化”。 --- ### ✅ 解题思路:贪心策略 —— 按扣款从大到小排序,尽量完成高罚款任务 #### 🔍 问题本质: - 有 $n$ 个任务,每个任务: - 必须在一个段内完成(耗 = 1) - 必须在第 $t_i$ 个间段 **之前** 完成(即最晚可在第 $t_i$ 段完成) - 目标:安排执顺序,使得 **被扣除的钱最少**,从而 **剩余奖金最多** > 注意:比赛不会让人赔钱 → 扣款总额不超过 $m$ --- ### 🎯 贪心策略:优先处理“罚款高”的任务 我们希望尽可能避免高额罚款。因此: 1. 将所有任务按 **扣款 $w_i$ 从大到小排序** 2. 对于每个任务(按此顺序),尝试将其安排在它截止间前的 **最晚可执间点**(即贪心地占用靠后的段) 3. 如果该段已被占用,则往前找空闲4. 如果无法安排(即从 1 到 $t_i$ 都满了),则放弃这个任务(要被扣钱) 这样可以保证:**高罚款任务尽可能被执,低罚款任务才被舍弃** --- ### ✅ 算法步骤: 1. 读入数据,构建结构体数组保存 $(t_i, w_i)$ 2. 按 $w_i$ 降序排序 3. 创建一个布尔数组 `used[1..n]` 表示第 $i$ 个间段是否已被使用 4. 初始化总扣款为 0 5. 遍历每个任务(从高罚款到低): - 从它的截止间 $t_i$ 开始,向前找第一个空闲的间段 - 如果找到,标记为已用(表示做了这个任务) - 如果找不到(前面全满),说明做不了,加上 $w_i$ 扣款 6. 最终答案:$m - \text{总扣款}$ --- ### ✅ C 语言代码实现: ```c #include <stdio.h> #include <stdlib.h> typedef struct { int t; // deadline int w; // penalty if not done } Game; // 按照 w 降序排列(罚款高的优先) int cmp(const void *a, const void *b) { return ((Game *)b)->w - ((Game *)a)->w; } int main() { int m, n; scanf("%d", &m); scanf("%d", &n); Game games[500]; for (int i = 0; i < n; i++) { scanf("%d", &games[i].t); } for (int i = 0; i < n; i++) { scanf("%d", &games[i].w); } // 按罚款金额从大到小排序 qsort(games, n, sizeof(Game), cmp); // 标记间段是否被占用(1~n) int used[501] = {0}; // used[i] = 1 表示第 i 个间段已安排任务 int total_penalty = 0; // 遍历每个游戏(优先处理高罚款) for (int i = 0; i < n; i++) { int found = 0; // 从截止间 t 向前找空闲段 for (int time = games[i].t; time >= 1; time--) { if (!used[time]) { used[time] = 1; found = 1; break; } } // 如果没找到空闲段,则必须扣款 if (!found) { total_penalty += games[i].w; } } printf("%d\n", m - total_penalty); return 0; } ``` --- ### 🔍 示例解析(输入样例) - 初始金钱:10000 - 游戏数:7 - 期限:`[4,2,4,3,1,4,6]` - 扣款:`[70,60,50,40,30,20,10]` 构造任务并按 $w_i$ 排序: | 原编号 | t | w | 排序后位置 | |--------|---|----|-----------| | 1 | 4 | 70 | 1st | | 2 | 2 | 60 | 2nd | | 3 | 4 | 50 | 3rd | | 4 | 3 | 40 | 4th | | 5 | 1 | 30 | 5th | | 6 | 4 | 20 | 6th | | 7 | 6 | 10 | 7th | 然后依次尝试安排: 1. $t=4, w=70$ → 占用4 2. $t=2, w=60$ → 占用间 2 3. $t=4, w=50$ → 4 已占,试 3 → 占用 3 4. $t=3, w=40$ → 间 3 已占,试 2→1 → 占用 1 5. $t=1, w=30$ → 间 1 已占 → 无法安排 → 扣 30 6. $t=4, w=20$ → 4 可用?不!4 被占了,但 4→3→2→1 全占 → 扣 20 7. $t=6, w=10$ → 间 6 空闲 → 占用 6 总扣款:30 + 20 = 50 最终获得:10000 - 50 = **9950** ✅ --- ### ⚠️ 关键点总结: - **贪心正确性证明思路**:若存在最优解未选某个高罚款任务而选了低罚款任务,交换它们不会变差,故贪心最优。 - 使用 `qsort` 需包含 `<stdlib.h>` - 间复杂度:$O(n^2)$,对 $n \leq 500$ 完全可 - 空间复杂度:$O(n)$ ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值