ZOJ 4067 Books (2018icpc青岛J) (贪心)
题意
给你一个长度为n的数组,代表每一个物品的价格。你有一个初始钱数\(x\),采用以下方法贪心:
从\(1\)到\(n\)扫一遍,如果\(x\)不比\(a[i]\)小,就买下它,买不起就跳过。
给你最终买的物品数量m,求\(x\)的最大值。
思路
我队的贪心菜的一笔,果然我也有很大的责任。。
首先如果最后全部买完,那么刚开始的钱一定是无穷多的。
我们先假设数组里没有0,那么通过题意中的贪心方法,最后买的一定是前m个。
证明:
当\(m=0\)的时候,显然成立。
假设当\(m=i\)的时候成立,即已经连续买了前\(i\)个。
买第\(i+1\)个的时候,如果不买\(a[i+1]\),而买了\(a[j]\),\(j>i+1\):
①当\(a[i+1]\leq a[j]\)时,由于题意中的贪心,如果买了\(a[j]\),对于\(j>i+1\),且\(a[j]\geq a[i+1]\)时,\(a[i+1]\)是必买的,所以不成立
②当\(a[i+1]>a[j]\)时,由于两个位置对m的贡献都为1,为使答案最大,还是要选最大的\(a[i+1]\)
综上所述,此时要买\(a[i+1]\)
再综上所述,最后买的一定是前m个
所以,没有0的时候,我们直接买前m个即可
当数组里是有0时,因为永远可以买0,所以要从m里减去0的个数,然后对剩下的数做上述算法
当然如果0的个数本身就超过\(m\),就是\(impossible\)的。
代码
注释提供了一些假算法的插点
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<string>
#include<stack>
#include<queue>
#include<deque>
#include<set>
#include<vector>
#include<map>
#include<functional>
#define fst first
#define sc second
#define pb push_back
#define mem(a,b) memset(a,b,sizeof(a))
#define lson l,mid,root<<1
#define rson mid+1,r,root<<1|1
#define lc root<<1
#define rc root<<1|1
#define lowbit(x) ((x)&(-x))
using namespace std;
typedef double db;
typedef long double ldb;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> PI;
typedef pair<ll,ll> PLL;
const db eps = 1e-6;
const int mod = 1e9+7;
const int maxn = 3e6+100;
const int maxm = 2e6+100;
const int inf = 0x3f3f3f3f;
const db pi = acos(-1.0);
int n,m;
ll a[maxn];
int cnt;
ll sum[maxn];
multiset<ll>s;
int main() {
int t;
scanf("%d", &t);
while(t--){
cnt=0;
scanf("%d %d", &n, &m);
for(int i = 1; i <= n; i++){
scanf("%lld", &a[i]);
if(!a[i])cnt++;
}
if(n==m){
printf("Richman\n");continue;
}
if(cnt>m){
printf("Impossible\n");continue;
}
ll ans=0;
m-=cnt;
int p = 0;
int num=0;
for(int i = 1; i <= n&&num<m; i++){
if(a[i]){ans+=a[i];p=max(p,i);num++;}
}
//printf(" %d\n",p);
ll mi = 0x7f7f7f7f7f7f7f7f;
for(int i = p+1; i <= n; i++){
if(a[i])mi=min(mi,a[i]);
}
if(mi==0x7f7f7f7f7f7f7f7f){
printf("Richman\n");continue;
}
printf("%lld\n",mi-1+ans);
}
return 0;
}
/*
2
7 6
4 1 0 3 0 0 1
6 5
4 5 0 3 0 0
*/
ZOJ 4067 Books (2018icpc青岛J) (贪心)的更多相关文章
- ZOJ 4067 - Books - [贪心][2018 ACM-ICPC Asia Qingdao Regional Problem J]
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=4067 题意: 给出 $n$ 本书(编号 $1 \sim n$), ...
- 2018ICPC青岛现场赛 重现训练
先贴代码,以及简要题解. 和一个队友下午双排打了一下,队友光速签到,我签的J被嫌弃写得慢以及演员...然后我秒出了E了思路然而难以置信这么简单的思路当时才过了十几个,于是发现D.F不是太好做.最后交了 ...
- ZOJ Problem Set - 3829Known Notation(贪心)
ZOJ Problem Set - 3829Known Notation(贪心) 题目链接 题目大意:给你一个后缀表达式(仅仅有数字和符号),可是这个后缀表达式的空格不幸丢失,如今给你一个这种后缀表达 ...
- [ZOJ 4062][2018ICPC青岛站][Plants vs. Zombies]
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=4062 题目大意:给一个大小为n的数组,数组编号从1到n,每一个元素的值代表 ...
- 【ZOJ 4067】Books
[链接] 我是链接,点我呀:) [题意] [题解] 统计a中0的个数cnt0 然后m减去cnt0 因为这cnt0个0是一定会取到的. 如果m==0了 那么直接找到数组中的最小值mi 输出mi-1就好 ...
- 2018ICPC青岛赛区J题
题目链接:http://acm.zju.edu.cn/onlinejudge/showRuns.do?contestId=1 这题真的坑,为什么要买0本书的时候,书架里面刚好有价格为0的时候输出&qu ...
- hdu 4070 福州赛区网络赛J 贪心 ***
优先发路程最长的 #include<cstdio> #include<iostream> #include<algorithm> #include<cstri ...
- ZOJ 4062 - Plants vs. Zombies - [二分+贪心][2018 ACM-ICPC Asia Qingdao Regional Problem E]
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=4062 题意: 现在在一条 $x$ 轴上玩植物大战僵尸,有 $n$ ...
- 2018ICPC青岛 E - Plants vs. Zombies (二分+模拟)
ZOJ - 4062 题意:有n个植物排成一排,按顺序植物的编号是1-n,每个植物都有一个生长速率,有一个机器人,机器人可以走m步,每走一步,这个机器人就会浇一次水,浇一次水那个植物就会长 自身的生长 ...
随机推荐
- Go数组和切片你不知道的区别
开篇语 数组和切片是两种不同的数据结构,比较常见,在Go语言中同时存在,今天我们就一起来看看他们在使用方式上,原理上的一些区别? 数组 在Go语言中,数组是一种具有相同类型固定大小的一种数据结构. 我 ...
- Spring Boot 入门(十):集成Redis哨兵模式,实现Mybatis二级缓存
本片文章续<Spring Boot 入门(九):集成Quartz定时任务>.本文主要基于redis实现了mybatis二级缓存.较redis缓存,mybaits自带缓存存在缺点(自行谷歌) ...
- 【GeneXus】在WorkWithPlus中如何定义未被包含的页面属性?
在使用GeneXus开发项目的过程中,有很多用户会使用到WorkWithPlus这个模板.通过WorkWithPlus的编辑器,让页面的调整变得极为简单,尤其是响应式页面.在WorkWithPlus的 ...
- C#实现的对文件的重命名
如下C#实现对文件的重命名的方法需要传入三个string类型的参数,分别是源文件的文件目录.目的文件目录和重命名的文件名称,实现代码如下: public ExecutionResult FileRen ...
- C#实现EXCEL表格转DataTable
C#代码实现把Excel文件转化为DataTable,根据Excel的文件后缀名不同,用不同的方法来进行实现,下面通过根据Excel文件的两种后缀名(*.xlsx和*.xls)分别来实现.获取文件后缀 ...
- 沈阳网络赛 F - 上下界网络流
"Oh, There is a bipartite graph.""Make it Fantastic." X wants to check whether a ...
- load文件到hive,并保存
DataFrame usersDF = sqlContext.read().load("hdfs://spark1:9000/users.parquet"); usersDF.se ...
- Python中的open()方法总结
总结Python中的open()方法 message= {'企业即时通信': 'aaa', '企业名称': 'bbb'} with open("..\\r.txt", " ...
- 安装numpy、matplotlib
一.安装numpy 1.下载 https://pypi.org/project/numpy/#files 2.安装 pip3 install numpy-1.17.3-cp37-cp37m-win_a ...
- EFK教程(5) - ES集群开启用户认证
基于ES内置及自定义用户实现kibana和filebeat的认证 作者:"发颠的小狼",欢迎转载 目录 ▪ 用途 ▪ 关闭服务 ▪ elasticsearch-修改elastics ...