ACM Doing Homework again

时间:2023-03-08 22:35:49
Ignatius刚刚从第30届ACM / ICPC回到学校。现在他有很多作业要做。每个老师给他一个截止作业的截止日期。如果Ignatius在截止日期之后进行了家庭作业,老师将减少他的最终考试成绩。现在我们假设做每个老师的作业总是需要一天的时间。以Ignatius希望你帮他安排做作业的顺序来减少分数的减少。

输入

每个测试用例从正整数N(1 <= N <= 1000)开始,表示作业数。然后两行。 第一行包含N个整数,表示作业的期限,下一行包含N个整数,表示减少的分数。
输出

对于每个测试用例,应该输出减少的最小总分数,每个测试用例一行。

Sample Input

3
3
3 3 3
10 5 1
3
1 3 1
6 2 3
7
1 4 6 4 2 4 3
3 2 1 7 6 5 4

Sample Output

0
3
5
Ignatius比赛回来之后,每位老师给Ignatius一个交作业的最后期限,如果交不上去就扣分。每门作业都要一天时间完成,求最少扣多少分。先输入一个T表示有T组测试数据,接下来每组数据先输入一个N,代表有N个作业,然后输入两行,第一行表示每门作业要交的日期,第二行表示对应的如果不交这门作业要扣的分数。输出要扣的最少分数。
 #include<bits/stdc++.h>
using namespace std;
struct node{
int dayline;
int descore;
bool flag;
}homework[];
bool cmp(node a,node b)
{
if(a.dayline!=b.dayline)
return a.dayline < b.dayline; /*按期限从短到长排序*/
else
return a.descore>b.descore; /*如果期限相同,按被扣分数从高到低来排序*/
} int main()
{
int t,n,temp;
while(cin>>t)
{
while(t--)
{
scanf("%d",&n); /*作业的数量*/
for(int i = ; i < n; i++) /*读取作业的期限*/
scanf("%d",&homework[i].dayline);
for(int i = ; i < n; i++) /*读取未完成作业被扣除的分数*/
{
scanf("%d",&homework[i].descore);
homework[i].flag = true; /*标记可完成*/
} sort(homework,homework+n,cmp);
int ans = ; /*统计被扣除的分数*/
int day = ; /*截止日期*/
for(int i = ; i < n; i++)
{
if(homework[i].dayline >= day)
day++;
else{
int p = homework[i].descore;
int temp = i;
for(int j =; j < i; j++) /*往前面搜索,查找是否有被扣分数较小的*/
if(homework[j].descore < p && homework[j].flag) /*被扣分数较少 并且是可完成的(用来完成被扣分较大的作业)*/
{
p = homework[j].descore;
temp = j;
} ans += p;
homework[temp].flag = false; /*标记不可完成*/
} }
cout<<ans<<endl;
}
}
return ;
}