有N根草,编号0至N-1。任务是剪草,使N根草的高度和不超过H。
在第0时刻,第i棵小草的高度是h[i] 。
接下来的每个整数时刻,依次执行:
(1)每根草i长高grow[i]。
(2)让某根草高度归零。注意:这棵小草并没有死掉,它下一秒还会生长。
(3)计算N根草的高度和,若不超过H则任务完成。
计算最早在第几时刻,任务会被完成?
如果一开始就完成了,输出0;如果永远不可能完成,输出-1。
否则输出一个最早的完成时刻。
1≤N≤501 ≤ N ≤ 501≤N≤50,0≤H≤1060 ≤ H ≤ 10^60≤H≤106,0≤h[i]≤1050 ≤ h[i] ≤ 10^50≤h[i]≤105,1≤grow[i]≤1051 ≤ grow[i] ≤ 10^51≤grow[i]≤105。

如果一开始就不超过HHH直接输出000。

显然每根草只需要剪一次,多剪没用。
并且设完成时刻为XXX,111~XXX的每一个时刻都要剪掉一根草。

长得快的草显然不可能先剪,所以一定是先剪长得慢的草。
所以我们会先剪长得慢的,再剪长得快的。
按照grow[i]grow[i]grow[i]排序,一个个剪,计算最后的高度和。吗?

前面有些草可能不必剪。
如果要拿现在计算出来的结果,去掉不用剪的部分,那也不行(影响很复杂)。

考虑其它方式。
既然不能倒着来,那就顺着推。
从111时刻开始,选择要剪掉的草。如果剪掉了生长速度第xxx慢的,那么111~xxx慢的都不会再选。
所以,记F[i][x]F[i][x]F[i][x]表示到第iii时刻,最多选择到了第xxx根草的最小高度和。
那么按顺序枚举iii,每个iii枚举i−1i-1i−1的x1x_1x1​和iii的x2x_2x2​然后做转移。
F[i][x2]=min{F[i−1][x1]+grow_sum−h[x2]−grow[x2]∗i}F[i][x_2]=min\{F[i-1][x_1]+grow\_sum-h[x_2]-grow[x_2]*i\}F[i][x2​]=min{F[i−1][x1​]+grow_sum−h[x2​]−grow[x2​]∗i}

ps. N怎么这么小(

本机对拍ac
网上好多题解好像都没有输出0的概念,一开始任务就完成的也照样输出1...
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstdlib>
#include<cctype>
#include<cmath>
#include<cstring>
#include<queue>
using namespace std;
int N,H,pre=0;
pair<int,int>grass[55]={};
int sum=0,f[55][55]={};
int main(){scanf("%d%d",&N,&H);for(int i=1;i<=N;++i)scanf("%d",&grass[i].second),pre+=grass[i].second;for(int i=1;i<=N;++i)scanf("%d",&grass[i].first),sum+=grass[i].first;sort(grass+1,grass+1+N);if(pre<=H){printf("0");return 0;}for(int i=1;i<=N;++i)for(int j=1;j<=N;++j)f[i][j]=0x3f3f3f3f;for(int i=0;i<=N;++i)f[0][i]=pre;for(int i=1;i<=N;++i){for(int j=1;j<=N;++j){for(int k=i-1;k<j;++k){f[i][j]=min(f[i][j],f[i-1][k]+sum-grass[j].second-grass[j].first*i);if(f[i][j]<=H){printf("%d",i);return 0;}}}}printf("-1");return 0;
}
数据生成器
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstdlib>
#include<ctime>
#include<cctype>
#include<cmath>
#include<cstring>
#include<queue>
#include<sstream>
using namespace std;
#define ll long long
ll GenRand(const ll Lim1,ll Lim2)
{++Lim2;ll ret=Lim1;int t=0;while(t<100){if(rand()/(RAND_MAX+1.0)<0.1)break;ret+=rand();ret%=Lim2;++t;}while(ret<Lim1)ret+=Lim1;ret%=Lim2;return ret;
}
int N,T;
stringstream ss;int main(int argc,char**argv)
{int seed=time(NULL);if(argc>1){ss.clear();ss<<argv[1];ss>>seed;}srand(seed);N=GenRand(1,50),T=GenRand(0,1000000);printf("%d %d\n",N,T);for(int i=1;i<=N;++i)printf("%d ",GenRand(0,100000));printf("\n");for(int i=1;i<=N;++i)printf("%d ",GenRand(0,100000));return 0;
}
对拍bat↓@echo off:loopdata_generator.exe %random% > data.instd.exe < data.in > std.outmy.exe < data.in > my.outfc my.out std.outif not errorlevel 1 goto loop
pausegoto loop

[NOIP2012模拟10.25] 剪草 [贪心+dp]相关推荐

  1. 【NOIP2012模拟10.25】剪草

    Description 有N棵小草,编号0至N-1.奶牛Bessie不喜欢小草,所以Bessie要用剪刀剪草,目标是使得这N棵小草的高度总和不超过H.在第0时刻,第i棵小草的高度是h[i],接下来的每 ...

  2. 【NOIP2012模拟10.25】旅行

    题目 给定一个n行m列的字符矩阵,'.'代表空地,'X'代表障碍.移动的规则是:每秒钟以上下左右四个方向之一移动一格,不能进入障碍. 计算:在空地中随机选择起点和终点(可以重合,此时最短耗时为0),从 ...

  3. JZOJ 3053 【NOIP2012模拟10.25】旅行

    旅行 题目大意 给定一个 n n行mm列的字符矩阵, 告诉你哪些格子可以进入,哪些不可以.移动的规则为:每秒钟以上下左右四个方向之一移动一格,不能进入障碍. 计算:在空地中随机选择起点和终点(可以重合 ...

  4. jzoj3058. 【NOIP2012模拟10.26】火炬手

    jzoj3058. [NOIP2012模拟10.26]火炬手 题目 Description Input Output Sample Input Sample Output Hint 分析 做法一 做法 ...

  5. jzoj5920. 【NOIP2018模拟10.21】风筝(dp,最长上升子序列)

    5920. [NOIP2018模拟10.21]风筝 Description 当一阵风吹来,风筝飞上天空,为了你,而祈祷,而祝福,而感动-- Description oyiya 在 AK 了 IOI 之 ...

  6. 【NOIP2018模拟10.25】 总结

    做题策略的总结 三道题,T1原本打了个错的DP,后来干脆改成了贪心,只花了30mins就解决了这题,获得了90pts的好成绩.T2想到了正解,写Code+对拍用了2h,最后因为数组开小获得了跟暴力一样 ...

  7. JZOJ 5925. 【NOIP2018模拟10.25】naive 的瓶子

    Description 众所周知,小 naive 有 n 个瓶子,它们在桌子上排成一排.第 i 个瓶子的颜色为 ci,每个瓶子都有灵性,每次操作可以选择两个相邻的瓶子,消耗他们颜色的数值乘积的代价将其 ...

  8. 【NOIP2012模拟10.20】友好数对

    Description 如果一个数a 能由一个数b 旋转得到,那么我们称<a,b>为友好数对,如12345 和45123 为友好数对,12345 和54321 不为友好数对.给出两个正整数 ...

  9. JZOJ 3057. 【NOIP2012模拟10.26】电影票

    .. 分析: 代码: 分析: 我们通过找规律,可以得知答案为: 但我们直接通过高精度计算的话铁定TTT飞 所以我们将式子带入其中,就会发现分母和分子是可以约分的!并且分母可以被约掉 所以我们可以创建两 ...

  10. 【NOIP2012模拟10.26】火炬手

    Description 全运会就要开始了,笨笨想成为湖南地区的火炬手,经过层层选拔,最终到了最后一关,这一关给出了一个正整数n(N<=100000),求一个最小的正整数m,使得n*m的十进制表示 ...

最新文章

  1. 必会Redis单节点、Sentinel和Cluster操作实战
  2. Citrix XenApp 下载及一年 developer license 获取
  3. Mysql 客户端查询结果如何保存到本地而不是服务端?
  4. 《程序员歌单》请查收
  5. SAP ABAP实用技巧介绍系列之如何创建Maintenance view
  6. 用HTTP的PUT方式发送请求
  7. [导入]纹理拼接后的Wrap寻址
  8. WebSnapshotsHelper(HTML转换为图片)
  9. Emmet 快速编写html代码
  10. 安装构建以太坊钱包Parity
  11. 深圳职业技术学院计算机专业组代码,深圳职业技术学院代码是多少 有哪些优势专业...
  12. python课程的中期报告_寒假中期学习报告
  13. 《深度学习入门:基于Python的理论与实现》源代码
  14. 计算机组成原理补码位算法,[计算机组成原理] Booth算法 —— 补码一位乘法
  15. 数据结构与算法_01链表
  16. 数据结构 严蔚敏 第八章 排序 期末复习总结
  17. springboot项目在外部tomcat运行出现的问题
  18. ionic自定义图标(ion-icon)
  19. 北京19家A类定点医院名单
  20. 简单的营销策略重复做,发挥到极致就是一心一意的去做

热门文章

  1. Android 渠道游戏 - 聚合SDK
  2. JAVA自行车类代码_租借自行车RentBikeController
  3. C语言:输入10个整数,找出其中绝对值最小的数
  4. 阿泰,水晶报表--pull模式样板
  5. QTest 命名空间
  6. [后缀自动机 模板题 || 字符串Hash] HDU 4622 Reincarnation
  7. 第五节:蜂鸣器的驱动程序
  8. mysql中between..and的用法
  9. ESP-MESH 无线组网,让智能家居通信组网更方便 | ESP32轻松学(Arduino版)
  10. Go:Comb sort 梳状排序(附完整源码)