1457 小K vs. 竹子
题目来源: CodeForces
基准时间限制:1 秒 空间限制:131072 KB 分值: 160 难度:6级算法题

 收藏
 关注

小K的花园种着n颗竹子(竹子是一种茎部中空并且长得又高又快的热带植物)。此时,花园中第i颗竹子的高度是hi米,并且在每天结束的时候它生长ai米。

实际上,小K十分讨厌这些竹子。他曾经试图去砍光它们,但由于竹子的茎部太坚固而失败了,然而,小K制作了魔法锤使这些竹子只能在地面上生长。

由于魔法力量有限,他每天最多能使用K次魔法锤。每次他使用魔法锤敲击竹子,竹子的高度就会减少p米。通过这次改变,如果竹子的高度变为负数,那它转而会变为0米(但它不会消失)。换言之,如果一颗被魔法锤敲击的竹子的高度是h,那它的新高度将会是max(0, h - p)米。我们可以在一天中多次敲击同一颗竹子。

小K将会从今天开始和这些竹子抗战m天。他的目标是在m天后使其中最高的竹子的高度最小化(即,“小K敲击竹子,然后竹子生长”的m次迭代)。找出m天后,最高的竹子的高度的最小可能值。

Input
输入的第一行包含四个以空格隔开的整数n,m和p(1 ≤ n ≤ 10^5 ,1 ≤ m ≤ 5000, 1 ≤k≤ 10, 1 ≤ p ≤ 10^9)。它们分别表示小K 花园中的竹子数,小K抗战的持续天数,每天小K能敲击竹子的最多次数和魔法锤的力量。
接下来n行描述了竹子的特性,第i行(1 ≤ i ≤ n) 包含两个以空格隔开的整数hi和ai,(0 ≤ hi ≤ 10^9, 1 ≤ ai ≤ 10^9),分别表示第i颗竹子的初始高度和生长速率。
Output
输出m天后,最高的竹子的高度的最小可能值。
Input示例
3 1 2 5
10 10
10 10
15 2
Output示例
17

这个题对着codeforces上的题解一直看不太懂。。。主要就是这一块:

ll target = (grow[i] - x) % p ? (grow[i] - x) % p : p;
while (target <= grow[i] - x)
{if (target <= h[i]){t[0]++;}else if((ll)ceil((double)(target - h[i]) / (double)v[i]) > (m - 1)){return 0;}else{t[(ll)ceil((double)(target - h[i]) / (double)v[i])]++;}target += p;
}

想了一下午这块的代码应该怎么搞,发现就是求x*v[i]+h[i]>=target target是要砍掉的长度,我们希望只要 x*v[i]+h[i]>=target 刚刚满足的那一天x,就把竹子砍掉。简单来说,就是这个魔法在满足条件的情况下尽量提前使用。搞懂了这块,感觉这个题二分顺畅了好多~。

代码:

#pragma comment(linker, "/STACK:102400000,102400000")
#pragma warning(disable:4996)
#include <iostream>
#include <algorithm>
#include <cstring>
#include <vector>
#include <string>
#include <cstdio>
#include <cmath>
#include <queue>
#include <stack>
#include <set>
#include <map>
using namespace std;#define INF 0x3fffffff
typedef long long ll;const int mod = 1e9 + 7;
const int maxn = 1e5 + 5;ll n, m, k, p, le, mid, ri;
ll h[maxn], v[maxn], grow[maxn], t[5005];void input()
{int i;scanf("%I64d%I64d%I64d%I64d", &n, &m, &k, &p);ri = 0;for (i = 1; i <= n; i++){scanf("%I64d%I64d", &h[i], &v[i]);grow[i] = h[i] + v[i] * m;ri = max(ri, grow[i]);}
}bool check(ll x)
{ll i, num = 0;for (i = 1; i <= n; i++){num += max(0LL, (ll)ceil((double)(grow[i] - x) / (double)p));}if (num > m*k){return 0;}memset(t, 0, sizeof(t));for (i = 1; i <= n; i++){if (grow[i] <= x)continue;ll target = (grow[i] - x) % p ? (grow[i] - x) % p : p;while (target <= grow[i] - x){if (target <= h[i]){t[0]++;}else if((ll)ceil((double)(target - h[i]) / (double)v[i]) > (m - 1)){return 0;}else{t[(ll)ceil((double)(target - h[i]) / (double)v[i])]++;}target += p;}}ll rest = 0;for (i = 0; i < m; i++){rest += t[i];rest = max(0LL, rest - k);}return rest == 0;
}void solve()
{le = 0; ri++;while (le < ri){mid = (le + ri) / 2;if (check(mid)){ri = mid;}else{le = mid + 1;}}printf("%I64d", ri);
}int main()
{//freopen("i.txt","r",stdin);//freopen("o.txt","w",stdout);input();solve();//system("pause");return 0;
}

51nod 1457:小K vs. 竹子相关推荐

  1. 小K的农场(luogu P1993

    题目传送门 题目描述 小K在MC里面建立很多很多的农场,总共n个,以至于他自己都忘记了每个农场中种植作物的具体数量了,他只记得一些含糊的信息(共m个),以下列三种形式描述: 农场a比农场b至少多种植了 ...

  2. BZOJ 3436 小K的农场 差分约束

    Description 背景 小K是个特么喜欢玩MC的孩纸... 描述 小K在MC里面建立很多很多的农场,总共n个,以至于他自己都忘记了每个农场中种植作物的具体数量了,他只记得 一些含糊的信息(共m个 ...

  3. P1993 小 K 的农场

    P1993 小 K 的农场 题解: 农场 a 比农场 b 至少多种植了 c 个单位的作物: 这句话说明:a - b > = c 转化可得 b - a < = - c add(a,b,-c) ...

  4. P1993 小K的农场 (差分约束)

    题目描述 小K在MC里面建立很多很多的农场,总共n个,以至于他自己都忘记了每个农场中种植作物的具体数量了,他只记得一些含糊的信息(共m个),以下列三种形式描述: 农场a比农场b至少多种植了c个单位的作 ...

  5. BZOJ 3436: 小K的农场( 差分约束 )

    orz云神... 真的给跪了...BFS版spfa T 掉了...然后DFS版的就A了...我现在很迷茫.... 这就是个普通的差分约束... ---------------------------- ...

  6. 【BZOJ - 3436】小K的农场(差分约束)

    题干: 背景 小K是个特么喜欢玩MC的孩纸... 描述 小K在MC里面建立很多很多的农场,总共n个,以至于他自己都忘记了每个农场中种植作物的具体数量了,他只记得 一些含糊的信息(共m个),以下列三种形 ...

  7. 【牛客 - 696D】小K的雕塑(dp,鸽巢原理,01背包类问题)

    题干: 链接:https://ac.nowcoder.com/acm/contest/696/D 来源:牛客网 小K有n个雕塑,每个雕塑上有一个整数 若集合T中的每一个元素在n个雕塑上都能找得到,则称 ...

  8. [BZOJ]3436: 小K的农场

    题解:  差分约束 模板题 差分约束系统  联系 最短路 对于操作1:$ a-b\geqslant c\rightarrow b\leqslant a-c $ 也就是说a向b连一条-c的边 对于操作2 ...

  9. 【差分约束】POJ3159/LG P1993 小K的农场

    终于把差分约束刷完了!!,这些题的套路都是很类似的 题目描述小K在MC里面建立很多很多的农场,总共n个,以至于他自己都忘记了每个农场中种植作物的具体数量了,他只记得一些含糊的信息(共m个),以下列三种 ...

  10. 小k娱乐网php,zblog仿小k资源模板Zblogphp系统精仿小k资源网主题模板面世啦!特惠福利...

    演示图奉上 PC端 手机端 后台演示 最新刀贱贱精仿小k资源网zblogphp程序模板面世啦!免费分享给大家 缔造精品,历经一个月,精雕细琢打磨 至简而美zblog终于发布啦!! 喜欢资源站的朋友不要 ...

最新文章

  1. mybatisplus修改单个属性_第二节 官封弼马温——类的属性
  2. Android SQLite保存多个选择题的选择信息
  3. 有了螃蟹让心情好一点
  4. 可以以数据内容当列名来统计数据
  5. 一文快速理解Java反射(详细对比图)
  6. paip.提升开发效率之查询界面
  7. 如何搭建谷歌离线地图服务
  8. web渗透中bypass防护系统
  9. QT界面主题风格设置
  10. C语言表白流星(末尾附加下载地址)
  11. 购买JSP空间上当的其他网友登载的地址
  12. 计算机是好是坏英语作文,电脑游戏是好还是坏英语作文
  13. [CF1504E]Travelling Salesman Problem
  14. 一个大牛的acm历程(看着就要颤抖)
  15. 命令控制之Telegram
  16. Xilinx AXI Interconnect相关知识汇总-AXI协议理解(三)
  17. linux - glib使用
  18. QNAP(威联通)联合创始人郭博达先生一行到访
  19. 计算机网络正常无法打开网页,电脑网络正常但是网页无法打开怎么样解决
  20. WINcc 导出历史数据

热门文章

  1. 贪心算法及其经典例题
  2. MySQL事务的保证机制
  3. C-COT目标跟踪-----连续卷积算子
  4. mysql 如何 导入txt文件_mysql中导入txt文件
  5. Word将英文数字全部修改为Times New Roman字体
  6. 计算机网络图片大全,说说心情图片大全唯美
  7. 2022-01-05 网工基础(十九)NAT基本原理与配置
  8. C语言数字图像处理---1.6图像亮度对比度调节
  9. Win32反汇编(一) 初步探索Win32反汇编 与 Ollydbg的简单使用
  10. excel如何把多张表合并成一个表_如何将多个 Excel 工作簿的工作表合并成一个工作表?...