CodeForces-1257D (贪心+双指针)
时间:2019-11-19
本文章向大家介绍CodeForces-1257D (贪心+双指针),主要包括CodeForces-1257D (贪心+双指针)使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
题意
https://vjudge.net/problem/CodeForces-1257D
你需要操作m个英雄去打败n只怪物,每个英雄的力量值为pi,可以打败si只怪物;每只怪物的力量值为ai。
当新的一天开始时,你可以选择其中1个英雄去打怪。若在之前已有k只怪物被打败,这个英雄将挑战第k+1只怪物,此时有两种情况:
1.英雄力量≤怪物力量,则英雄撤退,这一天结束。
2.英雄力量>怪物力量,怪物被打败。继续挑战下一只怪物。当n只怪物全部被打败,或该英雄已打败的怪物数量=si时,这一天结束。
你的任务是计算出打败所有怪物所需要的最小天数。
思路
最简单的想法就是用si大的尽可能多打。
维护每个耐力值si对应的力量最大的英雄,因为相等耐力值情况下肯定是选力量最大的要好。
再维护上面数组的后缀最大值,这个其实就是耐力值少的也可以(注意是可以!不是一定)用耐力值大的代替,比如对于耐力值i,i+1,如果i+1的力量大于i,那么完全可以用i+1代替i去打,因为耐力值比i大。
然后用双指针求解,当前遍历到第i个怪物,用j往右边延伸,看最远能打到哪个怪物,这里要实时记录这一段怪物力量的最大值,如果v[j-i+1]>=mx (v是上述处理完后缀最大值后的数组),那么就可以延伸,v[j-i+1]表示耐力值为j-i+1~n(这一段的耐力值大于mx的英雄都可以使用)的最大英雄力量值。
代码
#include<bits/stdc++.h> using namespace std; #define inf 0x3f3f3f3f #define ll long long const int N=200005; const int mod=1e9+7; const double eps=1e-8; const double PI = acos(-1.0); #define lowbit(x) (x&(-x)) int a[N],v[N]; int main() { std::ios::sync_with_stdio(false); int t; cin>>t; while(t--) { int n; cin>>n; for(int i=1;i<=n;i++) { cin>>a[i]; v[i]=0; } int m; cin>>m; for(int i=1;i<=m;i++) { int p,s; cin>>p>>s; v[s]=max(v[s],p); } for(int i=n-1;i>=1;i--) { v[i]=max(v[i],v[i+1]); } int i=1,j,ans=0,flag=0; while(i<=n) { if(a[i]>v[1]) { flag=1; break; } j=i; int mx=a[i]; while(j<=n&&v[j-i+1]>=mx) { j++; mx=max(mx,a[j]); } ans++; i=j; // cout<<i<<" "<<ans<<endl; } if(flag) cout<<-1<<endl; else cout<<ans<<endl; } return 0; }
原文地址:https://www.cnblogs.com/mcq1999/p/11887403.html
- spring boot 发送邮件
- spark 2.0主要特性预览
- y叔的ChIP-seq数据分析大礼包
- springboot的Web开发-Web相关配置
- Centos7下yum安装配置nginx与php
- CentOS7安装MySQL
- 分布式系统唯一ID生成方案汇总
- 操作系统底层技术——CPU亲和性
- AngularJS例子 ng-repeat遍历输出 通过js的splice方法删除当前行
- mongoDB报错Cannot find module '../build/Release/bson'
- 计算机视觉处理三大任务:分类、定位和检测
- Windows下RabbitMQ安装及入门
- 计算机视觉任务:图像梯度和图像完成
- Yarn【label-based scheduling】实战总结(一)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法