hihocoder编程练习赛50
A
描述
给定包含N个整数的数组A1, A2, … AN,你可以选择任意一个Ai,将Ai旋转到数组第一项,即将数组变成:
Ai, Ai+1, Ai+2, … AN, A1, A2, …, Ai-1
现在小Hi希望旋转之后的数组满足:
对于任意K(1 ≤ i ≤ N),前K项的和都是正数。
例如对于A=[3, -5, 2, -2, 3, 0],旋转成[3, 0, 3, -5, 2, -2]满足条件。
请你输出i,代表将Ai旋转到第一项满足条件。
如果有多解,你可以输出任意一个i。如果无解输出-1。
输入
第一行包含一个整数N。
第二行包含N个整数A1, A2, … AN。
对于50%的数据,1 ≤ N ≤ 1000
对于100%的数据,1 ≤ N ≤ 100000, -1000000 ≤ Ai ≤ 1000000
输出
一个整数表示答案。
样例输入
6
3 -5 2 -2 3 0
样例输出
5
参考AC代码
|
|
思路
贪心
寻找前缀和最小的最后一个位置 然后判断把后面所有的数字全部放到开头 判断是否满足要求
这样的贪心结果可以满足后面的数字和最大
B
描述
HIHO银行等待区有一排N个座位,从左到右依次编号1~N。现在有M位顾客坐在座位上,其中第i位坐在编号Ai的座位上。
之后又陆续来了K位顾客,(K + M ≤ N) 他们都会选择坐在最”舒适”的空座位上,并且过程中没有顾客离开自己的座位。
最”舒适”的定义是:
- 对于一个座位,我们将它左边连续的空座位数目记作X,它右边连续的空座位数目记作Y。
- 顾客首先会选择min(X, Y)最大的座位。
- 如果有多个选择,顾客会选择其中max(X, Y)最大的座位。
- 如果还是有多个选择,顾客会选择其中编号最小的座位。
请你计算出之后来的K位顾客坐在几号座位上。
输入
第一行包含三个整数N,M和K。
第二行包含M个整数A1, A2, … AM。
对于50%的数据,1 ≤ N ≤ 1000
对于100%的数据,1 ≤ N ≤ 100000, 1 ≤ Ai ≤ N, K + M ≤ N
输出
输出K行,每行一个整数代表该位顾客座位的编号。
样例输入
10 2 3
1 10
样例输出
5
7
3
参考AC代码
|
|
思路
stl模拟优先级
原本用优先队列写的 结果发现优先队列里没有迭代器 所以在k个人依次选择到自己的位置后 不会更新l和r数组
参考了别人的代码发现用set即可 先删除原本的位置 再更新l和r数组 再insert回去
注意l和r数组的更新为:坐下位置的l或r值+1
注意set的begin返回的是一个迭代器指针类型 加上星号才能变成node类型
补:题目的实质是找出最长区间 坐在中点位置 优先队列存放区间长度即可 维护一个l r和mid 每次弹出一个最长的区间 然后把该区间分成两半再push进去
C
cf原题
转跳连接