Advertisement
scixing

Untitled

Apr 9th, 2020
410
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.68 KB | None | 0 0
  1. #include <cstdio>
  2. #include <cmath>
  3. #include <algorithm>
  4. #include <list>
  5.  
  6. using namespace std;
  7.  
  8. int batt[210];
  9. double power[210];
  10. double ustime[210];
  11. list<int> Map[210];
  12.  
  13. int main() {
  14. int T;
  15. scanf("%d", &T);
  16. // int s, t;
  17. while (T--) {
  18. int N, M, B, E;
  19. scanf("%d %d %d %d", &N, &M, &B, &E);
  20.  
  21. for(int i = 1; i <= N; ++i) {
  22. scanf("%d", batt + i);
  23. }
  24. power[B] = E;
  25. int s, t;
  26. for (int i = 0; i < M; ++i) {
  27. scanf("%d %d", &s, &t);
  28. Map[s].push_back(t);
  29. }
  30. double basetime = 0;
  31. while (true) {
  32. double mintime = 9999999999;
  33. int flag = 1;
  34. for (int i = 1; i <= N; ++i) { // 这里可以通过队列仅把有功率的循环
  35. if (fabs(power[i] ) > 0.000001) {
  36. flag = 0;
  37. double ust = batt[i] / power[i];
  38. mintime = min(mintime, ust);
  39. }
  40. }
  41. if (flag) break;
  42. int temp[210] = {};
  43. basetime += mintime;
  44. // for (int i = 1; i <= N; ++i) // 这里可以通过队列仅把有功率的循环
  45. // if (batt[i] > 0) ustime[i] += mintime;
  46. for (int i = 1; i <= N; ++i) { // 这里可以通过队列仅把有功率的循环
  47. // if (batt[i] > 0) ustime[i] += mintime;
  48.  
  49. if (fabs(power[i] ) > 0.000001) {
  50. batt[i] -= power[i] * mintime;
  51.  
  52.  
  53. if (batt[i] == 0) {
  54. for (int j : Map[i]) {
  55. temp[j] += power[i] / Map[i].size();
  56. }
  57. power[i] = 0;
  58. ustime[i] = basetime;
  59. }
  60.  
  61. }
  62. }
  63. for (int i = 1; i <= N; ++i) {
  64. power[i] += temp[i];
  65. }
  66.  
  67.  
  68. }
  69.  
  70.  
  71. printf("%.4f", ustime[1] ? ustime[1] : -1);
  72. for (int i = 2; i <= N; ++i) printf(" %.4f", ustime[i] ? ustime[i] : -1);
  73. printf("\n");
  74. }
  75.  
  76. return 0;
  77. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement