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