hdu 1789 任务调度 贪心或dp

又是喜闻乐见的符合sample但是wa

http://acm.hdu.edu.cn/showproblem.php?pid=1789

我的:

1.话说看看这个cmp要记住,本来cmp没改连sample都不对

2.如果cb不能debug,重新安装完全版

3.cb debug可能会进入algorithm头文件中

4.我觉得错误也许在于随意的交换可能浪费了某些资源

这道题貌似可以dp


#include <iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
typedef struct homework
{
    int d,r,f;
}Homework;
Homework h[1030];
int T,N;
int cmp(Homework a,Homework b)
{
    if(b.r!=a.r)
    {
        return a.r>b.r;
    }
    else
      return a.d<b.d;
}
int main()
{
    scanf("%d",&T);
    while(T-->0)
    {
        scanf("%d",&N);
        int i;
        for(i=0;i<N;i++)
        {
            scanf("%d",&h[i].d);
        }
        for(i=0;i<N;i++)
        {
            scanf("%d",&h[i].r);
        }
        sort(h,(h+N),cmp);
        int day=0,cnt=0,red=0;;
        int mark[1030]={0};
        while(cnt<N)
        {
            day++;
            if(day<=h[cnt].d)
            {
                mark[cnt]=1;
                h[cnt].f=day;
                //printf("%d finish h[cnt].d=%d\n",cnt,h[cnt].d);
            }
            else
            {
                int k,flag=0;
                for(k=0;k<N;k++)
                {
                  if(mark[k]&&h[k].d>=day&&h[k].f<=day)
                  {
                      mark[cnt]=1;
                      flag=1;
                     // printf("CHAGE:%d %d %d\n",h[k].d,day,h[k].f);
                      h[cnt].f=h[k].f;
                      h[k].f=day;
                  }
                }
                if(flag==0)
                {
                    red+=h[cnt].r;
                    //printf("+%d\n",h[cnt].r);
                    day--;
                }
            }
            cnt++;
        }
        printf("%d\n",red);




    }
    return 0;
}


别人的:

此题大致思路,既然要计算最少扣多少分,就要在最后时间之前把扣分最多的作业先安排了。如果扣分一样多的话,那必然要把时间比较紧的先安排了。所以先按扣分的高低,由高向低排序,如果两门课扣分相同就按他们的结束时间由低向高排序!然后安排即可!

#include<stdio.h>  
#include<stdlib.h>  
#include<string.h>  
#define N 1000  
int f[N+5];  
struct T  
{  
 int deadline;  
 int score;  
}homework[N+5];  
int cmp(const void*a,const void*b)  
{  
 if((*(struct T*)a).score!=(*(struct T*)b).score)  
  return (*(struct T*)b).score-(*(struct T*)a).score;  
 else  
  return (*(struct T*)a).deadline-(*(struct T*)b).deadline;  
}  
int main()  
{  
 int C,n,i,j,sum;  
 scanf("%d",&C);  
 while(C--)  
 {  
  memset(f,0,sizeof(f));  
  scanf("%d",&n);  
  for(i=0;i<n;i++)  
   scanf("%d",&homework[i].deadline);  
  for(i=0;i<n;i++)  
   scanf("%d",&homework[i].score);  
  qsort(homework,n,sizeof(homework[0]),cmp);  
  for(i=0,sum=0;i<n;i++)  
  {  
   for(j=homework[i].deadline;j>0;j--)          //从最后的期限开始考虑前几天有没有被安排  
   {  
    if(f[j]==0)  
    {  
     f[j]=1;break;  
    }  
   }  
   if(j==0)                                                    //如果一直到结束都没有空余时间,最后只能扣分  
    sum+=homework[i].score;  
  }  
  printf("%d\n",sum);  
 }  
 return 0;  
}  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值