Advertisement
Guest User

Untitled

a guest
Feb 22nd, 2017
61
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.13 KB | None | 0 0
  1. using System.Collections.Generic;
  2. using System.Linq;
  3.  
  4. namespace SortingAlgorithms.MergeSort
  5. {
  6. /// <summary>
  7. /// Fiecare proiect are doua proprietati: Duration si PayOff. Ii mai adaugam noi una: Raport (bani/timp)
  8. /// </summary>
  9. public class Project
  10. {
  11. public float Duration { get; set; }
  12. public float PayOff { get; set; }
  13. public float Raport { get; set; }
  14. }
  15.  
  16. /// <summary>
  17. /// Putem lua fiecare proiect ca fiind full-time/part-time
  18. /// </summary>
  19. public class TakenProject
  20. {
  21. public Project Project { get; set; }
  22. public bool TakenAsFullTime { get; set; }
  23. public float PayOff { get; set; }
  24. }
  25.  
  26. public class Greedy
  27. {
  28. private List<Project> Projects { get; set; }
  29.  
  30. public List<TakenProject> GetProjects()
  31. {
  32. // Calculam raportul bani/timp pentru fiecare proiect
  33. foreach (var project in Projects)
  34. project.Raport = project.PayOff / project.Duration;
  35. var result = new List<TakenProject>();
  36. // ordonam proiectele descrescator, in functie de raportul bani/timp
  37. var orderedProjects = Projects.OrderByDescending(project => project.Raport).ToList();
  38. // pregatim o variabila in care pastram timpul petrecut pentru proiecte (0.0f = 0 in float)
  39. var spentTime = 0.0f;
  40. var i = 0;
  41. // atata timp cat timpul petrecut pentru proiectele selectate deja
  42. // + timpul urmatorului proiect din lista e mai mic de 10 (10.0f = 10 in float)
  43. while (spentTime + orderedProjects[i].Duration <= 10.0f)
  44. {
  45. // adaugam la rezultat proiectul ca full-time
  46. result.Add(new TakenProject
  47. {
  48. Project = orderedProjects[i],
  49. TakenAsFullTime = true,
  50. // fiind full-time, payoff-ul e acelasi (nu scadem nimic din el)
  51. PayOff = orderedProjects[i].PayOff
  52. });
  53. // adaugam durata proiectului actual la timpul petrecut si continuam
  54. spentTime += orderedProjects[i].Duration;
  55. i++;
  56. }
  57. // putem termina while-ul de mai sus cu, de ex: spentTime = 9.8
  58. // asadar nu putem lua urmatorul proiect ca fiind full-time (pentru ca
  59. // depasim cele 10 ore inpuse ca maxim. Asa ca aflam cat % din ultimul proiect putem lucra:
  60. var timeTakenFromLastProjectInPercentages = (10.0f - spentTime) / orderedProjects[i].Duration * 100;
  61. // si adaugam proiectul la rezultat
  62. result.Add(new TakenProject
  63. {
  64. Project = orderedProjects[i],
  65. // Il luam ca part-time:
  66. TakenAsFullTime = false,
  67. // si fiind part-time, payoff-ul e direct proportional cu cat am lucrat
  68. // deci procentajul de mai sus inmultit cu payoff-ul
  69. PayOff = timeTakenFromLastProjectInPercentages * orderedProjects[i].PayOff
  70. });
  71. return result;
  72. }
  73. }
  74. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement