标签:int 为我 include bae 不同 cno 数据规模 数值 特殊
这道题因为我还没有通过,只能展示我15分的代码,如果有人能明白我错在哪里,请务必告诉我修正过来,谢谢
如果你希望得到的是正确的AC的代码,这个文章可能并不能帮助你,很抱歉
2020.6.25
预处理a[i]和h[i],将他们按照数值从小到大排序,然后依次为每一个a[i]计算答案
具体地,对于每一个a[i],均为其在排序后的h[i]中找到最后一个小于等于a[i]的数的下标p[i]
特殊处理:将p[0] = 0, 则易得到a[i]所对应的答案为p[i] - p[i-1],因为p[i-1]代表的是最后一个小于等于a[i-1]的数的下标
正因为第i-1只小猴子把他能够到的香蕉都摘下来了,所以第i只猴子肯定是得从上一只小猴子摘下的最后一个香蕉再+1的香蕉开始摘。
第几步(步) | 干什么 |
1 | 输入a[i] |
2 | 输入banana[i](在题目中是h[i]) |
3 | 将a[i]从小到大排序 |
4 | 将banana[i]从小到大排序 |
5 | 求出p |
那么问题来了:怎么求出p,还只能使用一层for循环
我推荐使用一个函数:upper_bound(数组开始的下标,数组结束的下标,查找的数(后面用val表示) ) - 数组名
这个函数的作用是查找固定的数组中大于等于我查找的val的下标,可是我们查找的是小于等于
我们虽然返回的是大于val的下标,可是我们已经将这个数组排过序了,直接-1就能成为小于等于了
#include<cstdio> #include<iostream> #include<algorithm> using namespace std; long long place, n, m, banana[10000000], max_tmp; struct monkey{ long long b;//跳得高度 long long array;//旧的下标 long long num;//能摘到的桃子的数量 long long p;//在banana的范围内最后一个小于等于a[i]的下标 }a[10000000]; bool cmp(monkey x, monkey y){//按照跳的高度来排序 return x.b < y.b; } bool cmp2(monkey x, monkey y){//按照原来输入的顺序来排序 return x.array < y.array; } int main(){ cin >> n >> m; for(long long i = 1;i <= n;i++){ cin >> a[i].b; a[i].array = i; } sort(a+1, a+n+1, cmp);//按照跳的高度来排序 for(long long i = 1;i <= m;i++){ cin >> banana[i]; } sort(banana+1, banana+m+1); for(long long i = 1;i <= n;i++){ a[i].p = (upper_bound(banana, banana+m, a[i].b) - banana) - 1; //upper_bound(开始的下标,结束的下标,查找的量)-数组名称 //以上是固定写法 //upper_bound()原来是返回大于我要查找的量的下标 //可是我要求的是小于等于的下标,所以要-1 } a[0].p = 0; for(long long i = 1;i <= n;i++){ a[i].num = a[i].p - a[i-1].p; } sort(a+1, a+n+1, cmp2);//按照原来输入的顺序来排序 for(int i = 1;i <= n;i++){ cout << a[i].num << ‘ ‘; } return 0; }
标签:int 为我 include bae 不同 cno 数据规模 数值 特殊
原文地址:https://www.cnblogs.com/elisa02/p/13191248.html