题目:http://acm.hdu.edu.cn/showproblem.php?pid=1789
现在有N门作业,每门有截止日期和扣的分数,找出最少扣分的方法。
思路:先找到截止日期最晚的,然后往前推,先做价值最大的,这样就能最大限度减少损失。
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn = 1000 + 5;
struct subject
{
int cost, ddl;
};
bool cmp(subject a, subject b)
{
if (a.cost < b.cost)return 1;
return 0;
}
int main()
{
subject a[maxn];
int T,n,i;
cin >> T;
while (T--)
{
int ans = 0, day = 0;
cin >> n;
for (i = 0; i < n; i++)
{
cin >> a[i].ddl;
day = max(day, a[i].ddl);
}
for (i = 0; i < n; i++)
cin >> a[i].cost;
sort(a, a + n, cmp);
for (int j = day; j >0; j--)//从最晚截止日期开始
{
for (i = n - 1; i >= 0; i--)
{
if (a[i].ddl >= j)
{
a[i].cost = 0;
a[i].ddl = 0;
break;
}
}
}
for (i = 0; i < n; i++)
ans += a[i].cost;
cout << ans << endl;
}
return 0;
}