Есть следующая задача:
Код:
Программисту-фрилансеру Васе Пупкину требуется выполнить n заданий за n дней. У каждого задания известен свой дедлайн, а также его стоимость(то есть, если он не выполняет задание в указанное время, то его работа не оплачивается). Вася настолько крут, что за один день может сделать одно задание. Выполнение задания можно начать с момента 0. Ваша задача определить максимальную прибыль Васи.
Пример исходных данных:
Код:
3
60 2
65 2
70 2
Результат:
Код:
135
За два дня Вася успеет решить только две задачи, и он выберет вторую и третью, что даст ему прибыль в 135 единиц.
Эту задачу нужно решить на C# с использованием жадного алгоритма. Мое решение приведено ниже. Вывод времени добавлен с целью контролировать, сколько работает программа, он необязателен. Файл читается по байтам тоже для быстроты. Программа работает правильно, и проходит все тесты, кроме последнего, ибо там 100000 исходных данных, а нужно успеть за секунду. Что еще ускорить я не знаю.
Код:
using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
var y = new List<Tuple<int, int>>();
var sset = new List<int>();
Console.WriteLine(DateTime.Now.ToString("h:mm:ss ffff"));
FileStream fileStream = new FileStream(@"input.txt", FileMode.Open, FileAccess.Read);
int num = 0;
int t = fileStream.ReadByte() - 48;
while (t >= 0)
{
num = 10 * num + t;
t = fileStream.ReadByte() - 48;
}
while (t < 0)
{
t = fileStream.ReadByte() - 48;
}
for (int i = 0; i < num; i++)
{
int newcost = 0;
int newdeadline = 0;
while (t >= 0)
{
newcost = 10 * newcost + t;
t = fileStream.ReadByte() - 48;
}
while (t < 0)
{
t = fileStream.ReadByte() - 48;
}
while (t >= 0)
{
newdeadline = 10 * newdeadline + t;
t = fileStream.ReadByte() - 48;
}
if (i != num - 1)
{
while (t < 0)
{
t = fileStream.ReadByte() - 48;
}
}
y.Add(Tuple.Create(-newcost, newdeadline));
sset.Add(i);
}
sset.Add(num);
sset.Add(num + 1);
y.Sort(Comparer<Tuple<int, int>>.Default);
Int64 sum = 0;
for (int i = 0; i < num; i++)
{
int lval = 0;
int uval = sset.Count - 1;
while ((uval - lval) != 1)
{
int mid = (int)((lval + uval) / 2);
int zuval = sset[mid];
if (zuval > y[i].Item2) { uval = mid; } else { lval = mid; }
}
int xzuval = sset[lval];
if (xzuval == 0)
{
sset.RemoveAt(sset.Count - 1);
}
else
{
sset.RemoveAt(lval);
sum = sum - y[i].Item1;
}
}
Console.WriteLine(DateTime.Now.ToString("h:mm:ss ffff"));
StreamWriter sw = new StreamWriter(@"output.txt");
sw.WriteLine(sum);
sw.Close();
}
}
}
-- 30.05.2019, 13:17 --И еще - если на C# быстрее не получится, можно на C++, если будет быстрее, но там я вообще не представляю как.