题目:小v上学,老师布置了n个作业,每个作业恰好需要一天做完,每个作业都有最后提交时间及其逾期的扣分。请给出小v做作业的顺序,以便扣最少的分数。
输入:包含多个测试用例。每个测试用例的第1行为整数n(1≤n≤100),表示作业数,第2行包括n个整数,表示每个作业最后提交的时间(天),第3行包括n个整数,表示每个作业逾期的扣分。以输入n=0结束。
输出:每个测试用例对应两行输出,第1行为做作业的顺序(作业编号之间用空格分隔),第2行为最少的扣分。
测试用例:
输入: 3 1 3 1 6 2 3 0
输出:
1 2 3
#include<iostream>
#include<algorithm>
using namespace std;
struct ddl
{
int time;//时间
int score;//分数
}d[10000];
bool cmp(ddl a,ddl b)//按分数排名
{
if(a.score>b.score)
return true;
else
return false;
}
int main()
{
bool f[1000000];//存放能否在这一天完成
int t;
cin>>t;
for(int i=0;i<t;i++)
{
int sum=0;//所有项目的总分
int n;
cin>>n;
for(int j=0;j<n;j++)
{
cin>>d[j].time;
}
for(int j=0;j<n;j++)
{
cin>>d[j].score;
sum=sum+d[j].score;
}
for(int j=1;j<=n;j++)
{
f[j]=0;//初始化
}
sort(d,d+n,cmp);
int count=0;//本次得到的分数
for(int k=0;k<n;k++)//对每个分数遍历
{
for(int j=d[k].time;j>=1;j--)
{//从后往前安排,尽可能的把做的时间靠近DDL,防止浪费其他时间
if(!f[j])
{//没有就安排上
f[j]=1;
count=count+d[k].score;
break;
}
}
}
cout<<sum-count<<endl;
}
}