解题报告 HDU1789 Doing Homework again

时间:2024-07-23 18:36:56
Doing Homework again

Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u

Description

Ignatius has just come back school from the 30th ACM/ICPC. Now he has a lot of homework to do. Every teacher gives him a deadline of handing in the homework. If Ignatius hands in the homework after the deadline, the teacher will reduce his score of the final test. And now we assume that doing everyone homework always takes one day. So Ignatius wants you to help him to arrange the order of doing homework to minimize the reduced score.

Input

The input contains several test cases. The first line of the input is a single integer T that is the number of test cases. T test cases follow. 
Each test case start with a positive integer N(1<=N<=1000) which indicate the number of homework.. Then 2 lines follow. The first line contains N integers that indicate the deadlines of the subjects, and the next line contains N integers that indicate the reduced scores. 

Output

For each test case, you should output the smallest total reduced score, one line per test case. 

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

3
5
题意:
  给出课程的deadline和超时所扣的分 做一个作业要一天 求出最少的扣分方案
错误思路:
  一开始想当然地 先对deadline按升序排序 再对相同deadline的按扣分多少按降序排序
  然后从头开始 当之后的数据deadline比已用天数小的时候 就+到sum里
  这个思路是不对的 我们从最后一组数据就能测试出他的问题 如果按这种思路
  排序后:1 2 3 4 4 4 6
      3 6 4 7 5 2 1
  那么我们做到第四个数据 之后的数据就全部都无法完成了 得出的结果是8
  但是这个case下的最优解其实是: 不做第一天的3和第四天的2 其他都可以完成 结果是5
正确思路:
  这里我用的是hash表的思路
  先按分数降序排列 然后从头开始加到时间表里
  表的4 放上数据7 意思是第四天完成7这个作业
  放5的时候冲突了 于是放到3 第三天完成5这个作业
  之后同理 如果无法放到表中 说明这个任务无法完成 加到sum里 
ac代码:
其中的判定value大小的地方有垃圾部分 因为已经按降序排列 所以插入的时候没有比其中数据小的情况 懒得删了
 #include <iostream>
using namespace std;
int work;
int sum=;
struct w
{
int dl;
int score;
}a[]; void sort(w *a)
{
for(int i=;i<work-;i++)
{
for(int j=i+;j<work;j++)
if(a[j].score>a[i].score)
{
w t=a[j];
a[j]=a[i];
a[i]=t;
}
}
}
void insert(int *timeset,int pos,int value)
{
if(timeset[pos]==)
timeset[pos]=value;
else if(timeset[pos]>value&&(pos-)>)
insert(timeset,pos-,value);
else if(timeset[pos]>value&&(pos-)<=)
sum+=value;
else if(timeset[pos]<=value)
{
int t=timeset[pos];
timeset[pos]=value;
if((pos-)>)
insert(timeset,pos-,t);
else
sum+=t;
}
}
int main()
{
int N;
cin>>N;
for(int n=;n<=N;n++)
{
sum=;
cin>>work;
int maxdl=;
for(int i=;i<work;i++)
{
cin>>a[i].dl;
if(maxdl<a[i].dl)
maxdl=a[i].dl;
}
for(int i=;i<work;i++)
cin>>a[i].score;
int *timeset=new int[maxdl+];
for(int i=;i<maxdl+;i++)
timeset[i]=; sort(a); for(int i=;i<work;i++)
insert(timeset,a[i].dl,a[i].score); cout<<sum<<endl;
}
return ;
}