D - Expedition POJ - 2431——桶排序+贪心+优先队列

╰半夏微凉° 2022-06-18 12:08 282阅读 0赞

Think:
1题意一个卡车需要到小镇修理,他有一个无限加油箱,耗油量为每单位行程1单位耗油量,路上会经过加油站,假设已小镇作为坐标原点,则给出加油站的一维线性位置和储油量或卡车的初始一维线性位置和初始油量,题意如果能到达小镇,输出到达小镇的经过的最少加油站数量,如果不能到达小镇,则输出-1
2题目给出了卡车初始位置坐标范围,考虑可以运用桶排序,最少加油站问题则体现了贪心的思想,可以考虑用优先队列记录当前如果油量耗尽时可以加的一次性最大油量
3题目后台数据猜测:1无重复结点数据 2无加油站位置超过卡车位置的数据

poj原题链接

以下为Wrong answer代码
错误原因:当前符合最优解的加油站重复入队

  1. #include <iostream>
  2. #include <algorithm>
  3. #include <cstdio>
  4. #include <cstring>
  5. #include <queue>
  6. using namespace std;
  7. int vid[2000004];
  8. int main()
  9. {
  10. int n, i, cnt, flag;
  11. int u, v, x, y;
  12. priority_queue<int> q;
  13. cnt = 0, flag = 1;
  14. memset(vid, 0, sizeof(vid));
  15. scanf("%d", &n);
  16. for(i = 0; i < n; i++)
  17. {
  18. scanf("%d %d", &u, &v);
  19. vid[u] += v;
  20. }
  21. scanf("%d %d", &x, &y);
  22. while(x != 0)
  23. {
  24. if(x <= y)
  25. break;
  26. for(i = x; i >= x-y && i > 0; i--)
  27. {
  28. if(vid[i] != 0)
  29. q.push(vid[i]);
  30. }
  31. x = x-y;
  32. if(x < 0)
  33. break;
  34. else
  35. {
  36. if(q.size() == 0)
  37. {
  38. flag = 0;
  39. break;
  40. }
  41. else
  42. {
  43. y = q.top();
  44. q.pop();
  45. cnt++;
  46. }
  47. }
  48. }
  49. if(flag)
  50. printf("%d\n", cnt);
  51. else
  52. printf("-1\n");
  53. return 0;
  54. }

以下为Accepted代码

  1. #include <iostream>
  2. #include <algorithm>
  3. #include <cstdio>
  4. #include <cstring>
  5. #include <queue>
  6. using namespace std;
  7. int vid[2000004];
  8. int main()
  9. {
  10. int n, i, cnt, flag;
  11. int u, v, x, y;
  12. priority_queue<int> q;
  13. cnt = 0, flag = 1;
  14. memset(vid, 0, sizeof(vid));
  15. scanf("%d", &n);
  16. for(i = 0; i < n; i++)
  17. {
  18. scanf("%d %d", &u, &v);
  19. vid[u] += v;
  20. }
  21. scanf("%d %d", &x, &y);
  22. while(x != 0)
  23. {
  24. if(x <= y)
  25. break;
  26. for(i = x; i >= x-y && i > 0; i--)
  27. {
  28. if(vid[i] != 0)
  29. {
  30. q.push(vid[i]);
  31. vid[i] = 0;
  32. }
  33. }
  34. x = x-y;
  35. if(x < 0)
  36. break;
  37. else
  38. {
  39. if(q.size() == 0)
  40. {
  41. flag = 0;
  42. break;
  43. }
  44. else
  45. {
  46. y = q.top();
  47. q.pop();
  48. cnt++;
  49. }
  50. }
  51. }
  52. if(flag)
  53. printf("%d\n", cnt);
  54. else
  55. printf("-1\n");
  56. return 0;
  57. }

发表评论

表情:
评论列表 (有 0 条评论,282人围观)

还没有评论,来说两句吧...

相关阅读