Advertisement
Es7evam

Super Mario GEMA

Apr 4th, 2016
89
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.10 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. typedef long long ll;
  4. //x - número de moedas p/ voar
  5. //n - nro de moedas da fase
  6. //d - distância que voa
  7. const int N = 4000;
  8. ll in[N][2];
  9. int dp[N][N];
  10. int n,x;
  11. ll d;
  12.  
  13. int next(int i){
  14.     int lo = i, hi = n-1;
  15.     while (hi != lo){
  16.         int mi = (hi + lo + 1)/2;
  17.         ll dist = in[mi][0] - in[i][0];
  18.         if (dist <= d){
  19.             lo = mi;
  20.         }else{
  21.             hi = mi - 1;
  22.         }
  23.     }
  24.     return lo;
  25. }
  26.  
  27. int f(int c,int k){
  28. //res -> o valor retornado pela função
  29. //k -> nro de moedas que já pegou p/ voar
  30. //c -> nro de moedas pegas no round
  31.     if (c==n){ //chegou no final.
  32.         return 0;
  33.     }
  34.     int& res = dp[c][k];
  35.     if (res != -1){
  36.         res = f(c+1, k); //chama a prox moeda
  37.     }  
  38.     if(in[c][1]){
  39.         if(k != x-1) { //ele vai voar? sim / não
  40.             res = max(res , 1 + f(c+1,k+1)); //se voar
  41.         }else{
  42.             int w = next(c);
  43.             res = (w - c + 1) + f(w + 1, 0);
  44.         }
  45.        
  46.     }
  47.     return res;
  48. }
  49.  
  50.  
  51. int main(){
  52.     memset (dp, -1, sizeof dp);
  53.     scanf("%d %d %d", &n, &x, &d);
  54.     for (int i=0;i<n;i++){
  55.         scanf("%lld %lld", &in[i][0], &in[i][1]);
  56.     }
  57.     printf("%d\n", f(0,0));
  58.     return 0;
  59. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement