竞赛
考级
难度超低,新手小白都能会的教程来了!!! 难度 复杂度 60/100 40/100 ①首先☝️,先读题! Ta说: 给一个长度为n的单调递增的正整数序列,即序列中每一个数都比前一个数大。找一个数k,问序列中最后一个小于等于k的数是什么? ②然后☝️,理思路! 题目让我们做的事: ①:缩小满足条件数的最终范围(二分) 注意:1、左右边界的值不能相等(l+1<r) 2、满足a[t]<=k,l=t+1; 3、否则r=t-1; ②:根据最终左右边界的结果做判断,输出 注意:1、判断a[r]<=k,满足则输出a[r] 2、否则判断a[l]<=k,满足则输出a[l] 3、没找到则输出-1 ③最后☝️,我们来写代码! 拜拜👋
作者由于是个蒟蒻,所以试了7891遍都没做出来,一气之下用了暴力,竟然过了。 防抄袭 直接上代码
upper_bound()函数可以输入三个参数,区间的两端和x,通常写( a , a+n , x ) 或者 ( a.begin() , a.end() , x ),运行后返回一个迭代器,迭代器储存的是第一个大于x元素的地址,如果x大于所有元素,返回a.end()。
#include<bits/stdc++.h> using namespace std; int main() { long long a,b,c[200005],d=0,e; cin>>a>>b; for(int i=1;i<=a;i++) { cin>>c[i]; if(c[i]<=b) { e=c[i]; d=1; } } if(d==0) { cout<<"-1"; } else { cout<<e; } }
注意到数据范围只有200000,所以我们可以暴力解决问题 没什么好说的 直接上代码 最省事之题解
提交答案之后,这里将显示提交结果~