Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System.Collections.Generic;
- using System.Linq;
- namespace SortingAlgorithms.MergeSort
- {
- /// <summary>
- /// Fiecare proiect are doua proprietati: Duration si PayOff. Ii mai adaugam noi una: Raport (bani/timp)
- /// </summary>
- public class Project
- {
- public float Duration { get; set; }
- public float PayOff { get; set; }
- public float Raport { get; set; }
- }
- /// <summary>
- /// Putem lua fiecare proiect ca fiind full-time/part-time
- /// </summary>
- public class TakenProject
- {
- public Project Project { get; set; }
- public bool TakenAsFullTime { get; set; }
- public float PayOff { get; set; }
- }
- public class Greedy
- {
- private List<Project> Projects { get; set; }
- public List<TakenProject> GetProjects()
- {
- // Calculam raportul bani/timp pentru fiecare proiect
- foreach (var project in Projects)
- project.Raport = project.PayOff / project.Duration;
- var result = new List<TakenProject>();
- // ordonam proiectele descrescator, in functie de raportul bani/timp
- var orderedProjects = Projects.OrderByDescending(project => project.Raport).ToList();
- // pregatim o variabila in care pastram timpul petrecut pentru proiecte (0.0f = 0 in float)
- var spentTime = 0.0f;
- var i = 0;
- // atata timp cat timpul petrecut pentru proiectele selectate deja
- // + timpul urmatorului proiect din lista e mai mic de 10 (10.0f = 10 in float)
- while (spentTime + orderedProjects[i].Duration <= 10.0f)
- {
- // adaugam la rezultat proiectul ca full-time
- result.Add(new TakenProject
- {
- Project = orderedProjects[i],
- TakenAsFullTime = true,
- // fiind full-time, payoff-ul e acelasi (nu scadem nimic din el)
- PayOff = orderedProjects[i].PayOff
- });
- // adaugam durata proiectului actual la timpul petrecut si continuam
- spentTime += orderedProjects[i].Duration;
- i++;
- }
- // putem termina while-ul de mai sus cu, de ex: spentTime = 9.8
- // asadar nu putem lua urmatorul proiect ca fiind full-time (pentru ca
- // depasim cele 10 ore inpuse ca maxim. Asa ca aflam cat % din ultimul proiect putem lucra:
- var timeTakenFromLastProjectInPercentages = (10.0f - spentTime) / orderedProjects[i].Duration * 100;
- // si adaugam proiectul la rezultat
- result.Add(new TakenProject
- {
- Project = orderedProjects[i],
- // Il luam ca part-time:
- TakenAsFullTime = false,
- // si fiind part-time, payoff-ul e direct proportional cu cat am lucrat
- // deci procentajul de mai sus inmultit cu payoff-ul
- PayOff = timeTakenFromLastProjectInPercentages * orderedProjects[i].PayOff
- });
- return result;
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement