解题思路
思路很明确,首先要保证扣款最多的项目尽量完成,因此先将项目按照扣款金额从大到小排序,又为了尽可能让更多项目在期限内完成,扣款项目应当从自己的截止日期开始依次向前遍历,寻找离期限最近且没有项目安排的日期。
完整代码
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
struct info
{
int time;
int cost;
};
bool cmp(const info& a, const info& b)
{
return(a.cost > b.cost);
}
int main()
{
info task[504] = {0};
int m,n;
cin >> m >> n;
for(int i = 0; i < n; i++)
{
cin >> task[i].time;
}
for(int i = 0; i < n; i++)
{
cin >> task[i].cost;
}
sort(task, task+n, cmp); //sort函数结束地址位置要+1!!!
int hashlist[505] = {0};
int sum = 0;
for(int i = 0; i < n; i++)
{
int place = task[i].time;
for(int j = place; j > 0; j--)
{
if(hashlist[j] == 0)
{
hashlist[j] = 1;
break;
}
else if(j == 1 && hashlist[1] == 1)
sum += task[i].cost;
}
}
cout << m-sum << endl;
return 0;
}