A-DDL的恐惧
题干:
思路:此题要用贪婪算法,尽可能先提交分高的题目,当分数相同时,先交DDL靠前的。所以建立作业的结构体数组,将作业按照分数越高,DDL越靠前,在数组中位置越靠前的顺序存放。之后遍历数组内的作业,若该作业的DDL当天没有其他作业安排时,将该作业安排在当天完成,若当天已经安排了其他作业(一般是分数更高的),就从DDL往前寻找空闲的日期安排作业,若一直到第一天都有安排,那就舍弃这个作业。最后一定保证分数高的作业先完成而且DDL不冲突。
(ps:调试完成后要把测试点删干净,否则WA火葬场)
代码:
#include<iostream>
#include<string.h>
#include<algorithm>
using namespace std;
int T,n;
struct zuoye{
int ddl;
int score;
bool operator <(zuoye b)//重载比较符,保证所有的作业是按照分数越高,时间越早越往前排列
{
if(score!=b.score)
return score>b.score;
else
return ddl<b.ddl;
}
}a[100000];
int main()
{
cin>>T;//测试用例个数
// cout<<"test num is: "<<T<<endl;
for(int i=0;i<T;i++)
{
cin>>n;//作业数量
// cout<<"work's num is: "<<n<<endl;
int sum=0;//记录所有的和
for(int j=0;j<n;j++)
{
cin>>a[j].ddl;
}
cout<<endl;
for(int j=0;j<n;j++)
{
cin>>a[j].score;
sum=sum+a[j].score;
}
sort(a,a+n);
// for(int j=0;j<n;j++)
// {
// cout<<"ddl is: "<<a[j].ddl<<" ";
// cout<<"score is: "<<a[j].score<<endl;
// }
// cout<<"sum is: "<<sum<<endl;
int b[100000];//数组索引代表第几天,数组内存储当天需要完成的作业的索引
memset(b,-1,100000);
int index=0;// 当前作业需要存放在b中的位置
int c=0;//存放最大的ddl
for(int j=0;j<n