題外話
蒟蒻一枚…(坐在馬桶上都能看懂的題解)
穿越
這一道題難度可還行吧,至少沒有普及提高那麼難(QwQ)
在這裏,吾放一下樣例:
樣例輸入1
3 2
5 3 6
4 6
樣例輸出1
11
樣例輸入2
3 3
4 2 3
3 3 4
樣例輸出2
Bad luck
難度:⭐⭐
方法:很多
數據範圍限制
對於100%的數據,1<=N,M<=1000,1<=Hi,Pi<=1000。
法一:暴力判斷 (分數20分左右)
時間複雜度:O(n)
#include<bits/stdc++.h>
using namespace std;
int flag,a[10000],b[10000];
int main()
{
int n,m,sum=0;
cin>>n>>m;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<=m;i++) cin>>b[i];
for(int i=1;i<=n;i++)
if(a[i]>=b[i]&&b[i]-a[i]<a[i])
sum=sum+a[i];
else
cout<<"Bad luck"<<endl,flag=1;
if(!flag) cout<<sum;
return 0;
}
這只是個初步的大小判斷,其實這個代碼改一改是差不多能AC的,因爲數據太水了…
法二:暴力判斷的升級
上面的那一個代碼sort一下,再多一層for循環判斷,也許這一道題 基本就AC了
代碼:
......不顯示了吧......
法三:進階(AC)其實也有O(n*m)的,就是不sort的,不過不想講了…
時間複雜度:O(n+m)
輸入、排序和上面的一樣。
- 輸入
- 排序、從小到大排
- 外層一個1~m的循環,一個個找
- 裏面一個1~n的循環,一個個匹配
- 判斷跳的高度是否比蘋果高度高,如果高的話就是最優解(請讀者想一想爲什麼),否則繼續
- 如果找到一個高點了要標記一下,下一次就用這個點的下一個點來找(想想有何用意吧)
- 摘下的蘋果數加一,爲的是等一下看有沒有全部摘下來
- 找到了一個高點後直接break,因爲每個點只需一個小朋友摘就行
- 輸出
- 結束
給個關鍵的圖吧
也許你們會問:上面那個方法不已經行了嘛,搞這麼多幹嘛?
首先:上面那個存在風險,容易錯
第二:我們來看一看這一道題:
穿梭於知識的海洋之中
沒啥變化啊?
關鍵看這個:
上題:
這題:
. . . . . . . . . . . . . . . . . . . 華麗的分界線 . . . . . . . . . . . . . . . . . . . . .
OK,這一次就先講到這裏了,有問題私聊吧!
(如果對你有好處,請點個贊,謝謝)