HDU 1789:Doing Homework again

别人说这是水题。。。

好吧我的尊严书只剩下封面了。。。


我的思路就是给个四个数组

一个用来存放deadline 一个用来存放punishment 一个用来存放rearrange 一个用来存放flag

rearrange数组对应的序号即为截止日期

然后遍历punishment

将对应截止日期的并且惩罚最大的元素放进去

做好flag=1 即已经被占用了

这是第一轮


然后再次遍历punishiment数组

如果flag=0 即没被访问

则看能不能放进rearrange里面

并且序号是小于截止日期的

再次做好flag

这是第二轮


最后,再次遍历punishment

如果未被访问并且大于rearrange某个元素并且截止日期也是比相应的序号要大 则再次修改

这是第三轮


然后敲代码就爆炸了,原因是思路太复杂而且操作起来都不方便

四个数组 反正我已经是被绕晕了

真的烦


#include
#include
#include
using namespace std;
#define maxn 1111int a[maxn];//deadline
int b[maxn];//punishment
int c[maxn];//rearrange
int d[maxn];//flagint main()
{int t,i,j,n,v,h0,p,x;scanf("%d",&t);while(t--){scanf("%d",&n);for(i=0;ic[j]){c[j]=b[i];d[i]=1;}}for(i=1;i<=maxday;i++)if(c[i]==0){for(int h=0;hc[i]&&a[h]>=i){c[i]=b[h];h0=h;}}d[h0]=1;
//                        for(p=0;pc[y]&&a[i]>=y){x=c[y];c[y]=b[i];d[i]=1;for(j=0;j


后来看了一下别人的代码

收下我的膝盖吧

定义一个结构体

按照  分数大的优先 相等的就截止日期小的排在前面

然后依次填充rearrange数组 序号还是截止日期

如果已经被填充 就去找序号小于截止日期并且未被填充的空格

代码长度和检验的复杂度完全不是一个数量级的。。。


这种思路最好的地方就是它先放进去的一定是最优的选择

所以你就不用想着再去替换他

我的最后一步是选择已经占了坑的元素中小的再去替换出来

这其实问题是很多的。


唉,自己依旧行走在弱渣的道路上。

不过相信自己会有发光的那一天。


#include
#include
#include
#include
using namespace std;struct Work
{int deadline;int score;
}x[1002];//结构体数组bool cmp(Work a,Work b)
{if(a.score==b.score)return a.deadlineb.score;
}int main()
{int t,n,i,j,sum;bool a[10002];cin>>t;while(t--){sum=0;cin>>n;for(i=0;i=1;--j)if(!a[j]){a[j]=true;break;}//若某截止日期没有安排,则将来得及的作业放进去if(j==0)sum+=x[i].score;}printf("%d\n",sum);}return 0;
}






本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部