贪心-又在做作业了HDU - 1789年年
题目
https://vjudge.net/problem/HDU-1789
思路一
思路一是,让价值尽量大的作业,尽量往后安排。
为了实现思路一,我们需要从后往前遍历"时间",在每个时间节点选择满足当前条件的最大值,其中最大值我们使用优先队列实现。
以样例3为例,如图所示
一
七
1 4 6 4 2 4 3
3 2 1 7 6 5 4
从右往左看,黄色表示选择做的作业,灰色表示已经做了,绿色是最后没做的
代码
#包括牡蛎
#包括
#包括算法
使用命名空间标准;
结构节点{
国际时间,价格;
朋友布尔运算符(结构节点一个,结构节点b)
{
如果价格!=b.price)返回价格。
否则返回时间。
}//使用小于号,对于优先队列,效果是价格大的靠近顶部;对于分类函数,会把价格小的排在数组前面
};
bool cmp(节点一个,节点b){ 0
返回时间。
}
int main(void){ 0
int T=0;
CINT;
而(T-){ 0
priority _ queue节点Q;
节点arr[1005];
int N,total=0,DDL=0;
cin北部;
for(int I=0;I N;I){ 0
cin arr[i].时间;
ddl=ddl arr[i].时间ddl : arr[i].时间;
}
for(int I=0;I N;I){ 0
cin arr[i].价格;
总计=arr[i].价格;
}
排序(arr,arr N,CMP);
int j=0;
for(int I=DDL;I=1;i - ) {//错误:i=0
for(;arr[j].时间=I j N;j ) {//错误:1.时间=ddl 2 .缺少日本
//printf('%d '已被推送\n ',arr[j].时间);
q . push(arr[j]);
}
if(!q . empty()){ 0
//printf('总计是%d,Qtop是%d\n ',总计,Q.top().价格);
total -=Q.top().价格;
q . pop();
}
}
标准输出总恩德尔
}
返回0;
}
思路二
思路二的核心其实和思路一一样——让价值尽量大的作业,尽量往后安排。但是实现的方法不一样,既然我们想要让价值大的往后排,那我们不是只要让它在最后一天完成就好了但这样可能会有重复,没关系,那就让它往前一天,还是不行就两天,以此类推。为此我们需要将价值从大到小排序。
还是以样例3为例子,价值从大到小,如图所示
一
七
1 4 6 4 2 4 3
3 2 1 7 6 5 4
代码
#包括牡蛎
#包括
#包括算法
# includecstring
使用命名空间标准;
结构节点{
国际时间,价格;
};
bool cmp(节点一个,节点b){ 0
返回价格。
}
int main(void){ 0
int T=0;
CINT;
而(T-){ 0
priority _ queue节点Q;
节点arr[1005];
int vis[1005];
memset(vis,0,sizeof(vis));
int N,total=0,wave=0,DDL=0;
cin北部;
for(int I=0;I N;I){ 0
cin arr[i].时间;
ddl=ddl arr[i].时间ddl : arr[i].时间;
}
for(int I=0;I N;I){ 0
cin arr[i].价格;
总计=arr[i].价格;
}
排序(arr,arr N,CMP);
for(int I=0;I N;I){ 0
//for(int k=1;k=ddlk )printf('%d ',vis[k]);cout endl
int j;
for (j=arr[i]).时间;j=1 vis[j]!=0;j - ){}//这里很多我啊j啊,一定要沉下心来理清逻辑
vis[j]=arr[i].价格;
}
//for(int k=1;k=ddlk )printf('%d ',vis[k]);cout endl
for(int I=1;i=ddlI)花费=vis[I];
总支出;
}
返回0;
}
参考博客
https://www.cnblogs.com/blumia/p/hdu1789.html
https://blog.csdn.net/liluoyu_1016/article/details/78938559
内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/103403.html