1. 程式人生 > >hdu 1789 任務排程 貪心或dp

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;   }