1. 程式人生 > >[51Nod] (1279) 扔盤子 ---- 貪心+思維(逆向)

[51Nod] (1279) 扔盤子 ---- 貪心+思維(逆向)

題目傳送門

思路:

  • 試圖藐視平臺數據,正向思維模擬,暴力無果_(:з」∠)_ 。 需要複雜度更低的做法~
  • 如果盤子能落到井的位置pos,那麼pos之前的井口的寬度一定>=pos位置的井口的寬度。
  • 所以貪心的思想,我們可以把井口自底向上維護成一個不下降的序列。
  • 然後我們逆向思維,從底部向上填充盤子,這樣所得的答案最優。

AC程式碼:

#include<bits/stdc++.h>
using namespace std;

#define IO          ios_base::sync_with_stdio(0),cin.tie(0)
#define pb(x)       push_back(x)
#define sz(x) (int)(x).size() #define abs(x) ((x) < 0 ? -(x) : x) #define mk(x,y) make_pair(x,y) #define fin freopen("in.txt","r",stdin) #define fout freopen("out.txt","w",stdout) typedef long long ll; typedef pair<int,int> P; const int mod = 1e9+7; const int maxm =
1e8+5; const int maxn = 1e5+5; const int INF = 0x3f3f3f3f; const ll LINF = 1ll<<62; int w[maxn],p[maxn]; int main() { // fin; IO; int n,m; cin>>n>>m; w[0] = INF; for(int i=1;i<=n;i++) cin>>w[i]; for(int i=1;i<=n-1;i++) { if(w[i+1]>
w[i]) w[i+1] = w[i]; } // for(int i=1;i<=n;i++) cout<<w[i]<<" "; // cout<<endl; for(int i=1;i<=m;i++) cin>>p[i]; int cnt = 0; int pos = n; for(int i=1;i<=m;i++) { for(;pos>=1;pos--) { if(w[pos]>=p[i]){ cnt++; pos--; break; } } } cout<<cnt<<endl; return 0; }