a:第k小數
考查乙個函式nth_element()
具體用法:傳送門
其實就是只排好了陣列中指定的乙個數的位置,時間複雜度低
(因為這個題,去看了一下有關排序的其他函式,傳送門)
附ac**:
#include
#include
using
namespace std;
const
int n=
2e7+10;
inline
intread()
while
(ch >=
'0'&& ch <=
'9')
return x * f;
}int
main()
nth_element
(a,a+m-
1,a+n)
;//第m小的數,前面有m-1個數,第二個引數就是首位址+(m-1)
cout<<}}
b:不平行的直線
題目要求直線兩兩不平行也不重合,我們知道斜率k相同的話,必定是平行或重合的,那麼把乙個點和其他所有點連成的直線的斜率判斷一遍即可
附ac**:
#include
#include
using
namespace std;
const
int n=
210;
int x[n]
,y[n]
;map<
double
,bool
> f;
intmain()
for(
int i=
0;i} cout<}
c:丟手絹
輸入樣例的最後一行感覺是多餘的…
圍成乙個圈,兩個人的距離一定不會超過圈的一半tmp,如果沒有超過,那麼當前資料就加上到下個人的距離,如果超過了,那麼此時兩個人的距離就是min(maxx, sum - maxx),尺取法遍歷所有情況
#include
using
namespace std;
const
int maxn =
1e5+7;
typedef
long
long ll;
int n, a[maxn]
;ll sum;
intmain()
ans =
max(ans,
min(maxx, sum - maxx));
//因為"/"是整除,所有sum-maxx不是都比maxx小的
maxx -
= a[i];}
printf
("%lld\n"
, ans)
;}
d:二分(二分的標題,差分的本質)
mp記錄每乙個數被猜測到的可能性
以輸入樣例「6 +」為例,說明猜測的數比6大,我們將7~∞的每乙個數的可能性都+1
同理「8 -」,我們將-∞~7的每乙個的可能性都+1
「5 .」只將數字5的可能性+1
#include
#include
#include
using
namespace std;
const
int inf=
0x7f7f7f7f
;//0x7f7f7f7f即int型別的最大值(加乙個數就會溢位的那種大)
map<
int,
int>mp;
intmain()
if(ch==
'+')
if(ch==
'-')
}int ans=
-inf;
int k=0;
for(
auto x:mp)
cout<}
e:交換
這題不能用選擇排序,會超時。
可以用另乙個陣列復刻原陣列的值,記住陣列下標,然後逐個比較,不一樣就交換。交換後重新更新下標。
附ac**:
#include
using
namespace std;
const
int maxn =
1e5+5;
typedef
long
long ll;
int a[maxn]
,b[maxn]
;map<
int,
int>pos;
intmain()
sort
(b,b+n)
;int ans=0;
for(
int i=
0; i)printf
("%d\n"
,ans)
;}
2023年牛客演算法入門課練習賽2
dp題,沒做上來qaq include using namespace std const int inf 0x3f3f3f3f int h 205 dp 205 dp i 跳到第i級階梯的最小步數 intmain void dp 1 0 for int i 2 i n i dp maxh min ...
2023年牛客演算法入門課練習賽3 B
2020年牛客演算法入門課練習賽3 b 傳送門題意 給你乙個區間 l,r 和長度為n乙個陣列 n 15 考慮這個區間裡有多少個數能被8整除,並且無法被這個陣列中任何乙個數字整除。分析 由於要考慮不能被乙個陣列中的任何乙個元素進行整除,並且陣列中的數字比較大。個人感覺寫數字dp是沒有前途的。由於陣列比...
牛客演算法入門課練習賽2題解
a.古老的牛市,遺跡的天梯題目描述 牛市,乙個擁有悠久歷史的城市,2333年考古學家在牛市發現了乙個神秘的遺跡,這些勇敢而智慧型的古隊員準備進入這個遺跡,但要進入這個遺跡就需要通過一段天梯。而登上天梯必須要按照它要求的方法,否則就無法登上。它要求的方法為 可以直接登上比當前位置高1個單位高度的天梯。...