33,028
社区成员
发帖
与我相关
我的任务
分享
using System;
using System.Collections.Generic;
using System.Linq;
namespace CommonLab
{
class Program
{
class HomeWork : IComparable
{
//结束日期
public int Deadline;
//花费的时间
public int Spend;
//科目名称
public string Subject;
//最晚开始做的时间Deadline - Spend
public int PreDeadline
{ get { return Deadline - Spend; } }
public HomeWork() { }
public HomeWork(int deadline, int spend, string subject)
{
Spend = spend;
Deadline = deadline;
Subject = subject;
}
public HomeWork Clone()
{
HomeWork outer = new HomeWork(Deadline, Spend, Subject);
return outer;
}
public int CompareTo(object obj)
{
HomeWork B = obj as HomeWork;
if (B.Spend != Spend)
return Spend.CompareTo(B.Spend);
else if (B.Deadline != Deadline)
return Deadline.CompareTo(B.Deadline);
else
return Subject.CompareTo(B.Subject);
}
}
static void Main(string[] args)
{
//将作业科目添加到列表
List<HomeWork> homeWorkList = new List<HomeWork>();
Dictionary<string, HomeWork> dict = new Dictionary<string, HomeWork>();
homeWorkList.Add(new HomeWork(10, 10, "Computer"));
homeWorkList.Add(new HomeWork(11, 1, "English"));
homeWorkList.Add(new HomeWork(11, 1, "Math"));
homeWorkList.Add(new HomeWork(11, 1, "Math1"));
homeWorkList.Add(new HomeWork(11, 1, "Math2"));
homeWorkList.Add(new HomeWork(11, 1, "Math3"));
homeWorkList.Add(new HomeWork(11, 1, "Math4"));
//按照deadline排序
homeWorkList.Sort(CompareByDeadline);
//将列表内容复制一个副本
for (int i = 0; i < homeWorkList.Count; i++)
dict.Add(homeWorkList[i].Subject, homeWorkList[i].Clone());
//从后向前,把deadline向前推,处理后的任务占用时间互不重合
for (int i = homeWorkList.Count - 2; i >= 0; i--)
{
if (homeWorkList[i].Deadline > homeWorkList[i + 1].PreDeadline)
homeWorkList[i].Deadline = homeWorkList[i + 1].PreDeadline;
}
//建立一个优先队列,花费时间短的任务排在前头
SortedDictionary<HomeWork,int> pQueue = new SortedDictionary<HomeWork,int>();
int sumSpend = 0, currentSpend = 0, currendIndex = 0, reduced = 0;
Queue<string> homeWorkQueue = new Queue<string>();
int deadline = dict[homeWorkList[0].Subject].Deadline;
while (true)
{
//处理deadline之间的任务,将互相冲突的任务都加入队列
while (currendIndex < homeWorkList.Count && homeWorkList[currendIndex].Deadline <= deadline)
{
sumSpend += homeWorkList[currendIndex].Spend;
pQueue.Add(homeWorkList[currendIndex], homeWorkList[currendIndex].Spend);
currendIndex++;
}
//尽量选取花费时间短的任务
while ((currentSpend < deadline || currendIndex >= homeWorkList.Count) && pQueue.Count > 0)
{
HomeWork item = pQueue.ElementAt(0).Key;
if (currentSpend + item.Spend <= deadline || currendIndex >= homeWorkList.Count)
{
homeWorkQueue.Enqueue(item.Subject);
pQueue.Remove(item);
currentSpend += item.Spend;
//计算被扣的分数
if (currentSpend > dict[item.Subject].Deadline)
reduced += currentSpend - dict[item.Subject].Deadline;
}
else
{
//如果某些任务只做了一半,修改剩余需要花费的时间
item.Spend = currentSpend + item.Spend - deadline;
currentSpend = deadline;
}
}
//设定下一步需处理的deadline
if (currendIndex >= homeWorkList.Count)
break;
else if (pQueue.Count > 0)
deadline = Math.Min(sumSpend, dict[homeWorkList[currendIndex].Subject].Deadline);
else
deadline = dict[homeWorkList[currendIndex].Subject].Deadline;
}
//按照计算结果输出
Console.WriteLine(reduced);
while (homeWorkQueue.Count > 0)
Console.WriteLine(homeWorkQueue.Dequeue());
}
static int CompareByDeadline(HomeWork A, HomeWork B)
{
return A.Deadline.CompareTo(B.Deadline);
}
}
}
//1311853 2009-04-26 19:16:12 Accepted 1074 281MS 524K 1323 B C++ no way
#include<iostream>
#include<string>
using namespace std;
struct Node
{
string course;
int deadline;
int need;
}infor[16];
int n;
int binary[16] = {1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768};
int flag[65536];
bool mark[16];
string str[16],outs[16];
void dfs(int days,int cost,int sum,int num)//num表示选择的作业数
{ //days表示写作业的开始日期,cost表示前面的花费,sum记录作业是否完成情况
int i,temp;
if(num == n)
{
if(flag[sum] == cost)
{
flag[sum] = cost;
for(i=0;i<num;i++)
outs[i] = str[i];
}
return ;
}
for(i=1;i<=n;i++)
{
if(mark[i] == false)
{
mark[i] = true;
sum += binary[i];//要写第i门作业
///////////////////////////////////////////////////
temp = days + infor[i].need - infor[i].deadline;
if(temp < 0)
temp = cost;
else
temp += cost;
// 第i门作业完成后的代价 temp
//////////////////////////////////////
if(flag[sum] > temp)
{
flag[sum] = temp; //记录状态
str[num++] = infor[i].course;
dfs(days + infor[i].need,temp,sum,num);
num --;
}
sum -= binary[i];
mark[i] = false;
}
}
}
int main()
{
int t;
cin>>t;
while(t--)
{
int i,st=0;
cin>>n;
for(i=1;i<=n;i++)
cin>>infor[i].course>>infor[i].deadline>>infor[i].need;
for(i=0;i<65536;i++)
flag[i] = 1000000;
memset(mark,false,sizeof(mark));//标记状态
dfs(0,0,0,0);
for(i=1;i<=n;i++)
st += binary[i]; //结果存放在下标为st的flag[st]值中
cout<<flag[st]<<endl;
for(i=0;i<n;i++)
cout<<outs[i]<<endl;
}
return 0;
}