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
Sponsor
题意:
有个打ACM的人回来补作业,每个作业都有它的分数和截止日期,你每天只能写一项作业,剩下没完成的作业是要扣分滴,我们现在求,如何扣最小的分数。
思路:
按照常理来说我们肯定是要做更多的作业来实现扣分最小化,这样的话每个作业按照deadline排序就好,然后deadline相同的按分值排序就好。
但是,这里的作业分值不同,比如deadline为2的作业你有两份,分值都是100,deadline为1的作业你有两份,分值都为1,你肯定不能扣101分吧,你应该直接写那两份100分的,用扣一分的来替代扣100分的,然后扣两分。但是如果这两份100分值作业的deadline是4,那你就可以一份不扣。
再就是替代这个问题
具体看AC代码:
#include <iostream>
#include <algorithm>
using namespace std;
struct homework
{
int deadline;
int score;
bool flag;/*因为每个作业只能用来替代一次,所以有falg*/
}a[10000];注意超过100000用全局变量
bool cmp(homework x,homework y) 自定义排序
{
if(x.deadline==y.deadline)
return x.score>y.score;
else
return x.deadline<y.deadline;
}
int main()
{
int t;
for(cin>>t;t;t--)
{
int n,ans=0,data=1;
cin>>n;
for(int i=0;i<n;i++)
{
cin>>a[i].deadline;
}
for(int i=0;i<n;i++)
{
cin>>a[i].score;
a[i].flag=false;
}
/*输入每个作业的参数*/
sort(a,a+n,cmp);
for(int i=0;i<n;i++)
{
if(data<=a[i].deadline)
{
data++;
}/*可以写完算你走运(bu shi),继续下一项*/
else
{
int pos=i,tempscore=a[i].score;
/*写不完了吧哈哈,记录下目前的位置用于向前遍历寻找替罪羔羊*/
for(int j=0;j<i;j++)
{
if(a[j].score<tempscore&&a[j].flag!=true)/*擂台算法,推出前面的最小值*/
{
tempscore=a[j].score;
pos=j;
}
}
a[pos].flag=true;/*已经被淦一次了你还想怎样?*/
ans+=tempscore;/*又扣分了呢*/
}
}
cout<<ans<<endl;
}
return 0;
}
好,我们再来看看一个非常类似的题
A supermarket has a set Prod of products on sale. It earns a profit px for each product x∈Prod sold by a deadline dx that is measured as an integral number of time units starting from the moment the sale begins. Each product takes precisely one unit of time for being sold. A selling schedule is an ordered subset of products Sell ≤ Prod such that the selling of each product x∈Sell, according to the ordering of Sell, completes before the deadline dx or just when dx expires. The profit of the selling schedule is Profit(Sell)=Σx∈Sellpx. An optimal selling schedule is a schedule with a maximum profit.
For example, consider the products Prod={a,b,c,d} with (pa,da)=(50,2), (pb,db)=(10,1), (pc,dc)=(20,2), and (pd,dd)=(30,1). The possible selling schedules are listed in table 1. For instance, the schedule Sell={d,a} shows that the selling of product d starts at time 0 and ends at time 1, while the selling of product a starts at time 1 and ends at time 2. Each of these products is sold by its deadline. Sell is the optimal schedule and its profit is 80.
Write a program that reads sets of products from an input text file and computes the profit of an optimal selling schedule for each set of products.
Input
A set of products starts with an integer 0 <= n <= 10000, which is the number of products in the set, and continues with n pairs pi di of integers, 1 <= pi <= 10000 and 1 <= di <= 10000, that designate the profit and the selling deadline of the i-th product. White spaces can occur freely in input. Input data terminate with an end of file and are guaranteed correct.
Output
For each set of products, the program prints on the standard output the profit of an optimal selling schedule for the set. Each result is printed from the beginning of a separate line.
Sample Input
4 50 2 10 1 20 2 30 1
7 20 1 2 1 10 3 100 2 8 2
5 20 50 10
Sample Output
80
185
Hint
The sample input contains two product sets. The first set encodes the products from table 1. The second set is for 7 products. The profit of an optimal schedule for these products is 185.
题意:商店里有x个货,每个货都有自己的过期时间(过期了当然不能买了对吧(也许吧,小声bb)),也有每个商品的利润,问你,最多能买多少钱。
思路:同上,不过就是用sum-失去的价值,罢了
AC代码:自己写去;