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
0
3
5
题目描述:求最小扣分数
第一行为测试个数,第i个测试中包括三行,第一行为作业科目数,第二行为deadline;第三行为完不成扣分数;
思路:
刚开始思路:这个题我刚开始的思路是先按照分数从小到大排序相同分数在按照deadline少的在前面,再根据时间进行筛选,排序后第i个作业完成的天数为d【i】,如果前面有d【i】+1个比d【i】小的就拿出这个作业并累加;反之则继续。在运行的时候按照这个思路写好代码感觉对了,但是就是运行不出来;后来通过检查发现还需要判断前面通过的作业中有没有达到他的饱和值;也就是说d【i】之前如果刚好有d【i】 则之前的安排不上其他的数值了。
正确思路:
首先按照天数排序从小到大,相同天数扣分多的在前,如果d【i】<i 则说明这几个数中已经超出期限,选出最小的进行扣除,直到循环结束。
代码如下:
#include<iostream>
#include<algorithm>
#include<math.h>
#include<stdio.h>
#include<cstring>
#include <queue>
#include<iomanip>
using namespace std;
struct ch{
int day,score;
bool flag;
}arr[2000];
bool cmp(ch a,ch b)
{
if(a.day!=b.day)
return a.day<b.day;
else
return a.score>b.score;
}
int main()
{
int t;
cin>>t;
while(t--)
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
cin>>arr[i].day;
for(int i=1;i<=n;i++)
{cin>>arr[i].score;arr[i].flag=false;}
sort(arr+1,arr+1+n,cmp);
int b=0,k=1;
for(int i=1;i<=n;i++)
{
if(arr[i].day>=k)
{
k++;continue;
}
int a=arr[i].score,c;
for(int j=1;j<=i;j++)
{
if(arr[j].score<=a&&!arr[j].flag)
{
a=arr[j].score;
c=j;
}
}
b+=a;
arr[c].flag=true;
}
cout<<b<<endl;
}
}
在这串代码中***bool***类型起到了标记的作用,标记已经扣分的数组;