当前位置:编程学习 > C/C++ >>

hdu 1789 贪心算法

 
此题大致思路,既然要计算最少扣多少分,就要在最后时间之前把扣分最多的作业先安排了。如果扣分一样多的话,那必然要把时间比较紧的先安排了。所以先按扣分的高低,由高向低排序,如果两门课扣分相同就按他们的结束时间由低向高排序!然后安排即可!
[cpp]  
#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;  
}  
 
补充:软件开发 , C++ ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,