贪心。先考虑分值大的作业,如果使其在截至日期当天做,如果当天已经被占用,那么往前推一天,如果前面的全部被占用,则该作业无法完成。
1A,编程出了点情况,浪费了时间,跟踪比阅读代码好用。能较快找到问题。
#include <iostream>
using namespace std;
const int N = 1001;
int a[N];//时间
int b[N];//扣分
int flag[N];//是否已经判断过
int dp[N];//当天任务值
int main()
{
int t;
cin >> t;
while(t--)
{
int sum = 0;
int n;
cin >> n;
int maxDate = 0;
for(int i = 0; i < n; i ++)
{
cin >> a[i];
if(a[i] > maxDate)
maxDate = a[i];
}
for(int i = 0; i < n; i++)
{
cin >> b[i];
sum += b[i];
}
memset(flag, 0, sizeof(flag));
memset(dp, 0, sizeof(dp));
int md = maxDate;
while(md--)
{
int max = -1;
int index = -1;
for(int i = 0; i < n; i ++)
{
if(b[i] > max && flag[i] == 0)
{
max = b[i];
index = i;
}
}
if(max > -1)
{
int jieshou = 0;
for(int i = a[index]; i >= 1; i--)
{
if(dp[i] == 0)
{
dp[i] = b[index];
flag[index] = 1;
jieshou = 1;
break;
}
}
if(jieshou == 0)
{
flag[index] = 1;
md++;
}
}
}
for(int i = 1; i <= maxDate; i++)
{
sum -= dp[i];
}
cout << sum << endl;
}
return 0;
}