Advertisement
Guest User

Untitled

a guest
Oct 25th, 2016
57
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.31 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. const int _max = 10005;
  4. struct flights {
  5. int start;
  6. int end;
  7. int price;
  8. };
  9. bool operator <(flights first, flights second) { return first.end < second.end; }
  10. int next_upper_bound(int[],int,int);
  11. int main() {
  12. cin.tie(0);
  13. ios_base::sync_with_stdio(0);
  14. int test, n, duration;
  15. cin >> test;
  16. while(test--) {
  17. cin >> n;
  18. flights _flights[n];
  19. for(int i=0;i<n;i++) {
  20. cin >> _flights[i].start >> duration >> _flights[i].price;
  21. _flights[i].end = _flights[i].start + duration;
  22. }
  23. sort(_flights,_flights+n);
  24. int pj[n];
  25. int ends[n];
  26. int dp[n+1];
  27. for(int i=0;i<n;i++) ends[i] = _flights[i].end;
  28. for(int i=n-1;i>=0;i--) pj[i] = next_upper_bound(ends,_flights[i].start,n);
  29. dp[0] = 0;
  30. for(int i=1;i<=n;i++) dp[i] = max(_flights[i-1].price + dp[pj[i-1]],dp[i-1]);
  31. cout << dp[n] << "\n";
  32. }
  33. }
  34. int next_upper_bound(int ends[], int k,int n) {
  35. int lower = 0;
  36. int upper = n;
  37. while (lower < upper) {
  38. int middle = (lower + upper) / 2;
  39. if (k >= ends[middle]) lower = middle + 1;
  40. else upper = middle;
  41. }
  42. return lower;
  43. }
  44.  
  45. /*
  46. int next_lower_bound(int ends[], int k,int n) {
  47. int lower = 0;
  48. int upper = n;
  49. while (lower < upper) {
  50. int middle = (lower + upper) / 2;
  51. if (k <= ends[middle]) upper = middle;
  52. else lower = middle + 1;
  53. }
  54. return lower;
  55. }
  56. */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement