任务调度问题(贪心) hdu4864

传送门:http://acm.hdu.edu.cn/showproblem.php?pid=4864

The company hopes to maximize the number of the tasks which they can complete today.

If there are multiple solutions, they hopes to make the money maximum.

任务和机器都有两个属性,时长和等级。

只有机器的时长和等级都大于等于一项任务,机器才能完成这项任务。并且,

一项任务只能由一台机器完成,一台机器只能完成一项任务。( 每个任务有两个值花费时间x和难度y,)

我的代码:

 

#include<iostream>	//任务调度的贪心问题 
#include<cstring>
#include<cstdio>
#include<algorithm>  
using namespace std;
typedef long long ll;  
  
struct node  
{  
    int x,y;  			//x:花费时间;y:难度等级。 
}s1[100005],s2[100005];  	//机器数组s1,任务数组s2. 
bool cmp(node a,node b)  
{  
	return (a.x>b.x)||(a.x==b.x && a.y>b.y);
}//降序排序准则:按时间由大到小,时间相同则按等级由高到低。  
//将任务按照权值1降序排序,权值1相同的按照权值二降序排序,将机器也同样是如此
/*在给任务选择机器的时候,在满足要求的机器中(机器的两个权值都大于任务的两个权值)选择权值1最给小的分配给该任务,
这样保证了后面任务做的可能性增大*/  
int main()  
{  
    int n,m,i,j,cnt;  
    ll sum;  
    while(~scanf("%d%d",&n,&m))  //输入机器数n,和任务数目m。 
    {  
        for(i=0;i<n;i++)  
            scanf("%d%d",&s1[i].x,&s1[i].y);  
        for(i=0;i<m;i++)  
            scanf("%d%d",&s2[i].x,&s2[i].y);  
        sort(s1,s1+n,cmp);  
        sort(s2,s2+m,cmp);		//按时间由大到小,时间相同则按等级由高到低,将机器和任务分别排序。
//开始遍历任务:		  					//sum:the money they will get. 
//找出所有xi(xi>=xj),从中选择yi最小的一个作为这个任务的运行机器, 
        cnt=sum=0;  		//cnt:the maximum number of the tasks which the company can complete today  ;
        int c[105]={0};  	//the level of the task的区间是[0,100]. c[]是任务难度等级数组。 
        for(i=0,j=0;i<m;i++) 	//j和n和机器为伍;i和m和任务为伍。 
        {  	
								//对每一个任务而言:从第一个任务开始,挑选最合适的机器将其完成。 
            while(j<n && s1[j].x>=s2[i].x)  
            {  
                c[s1[j].y]++;	//自增  
                j++;  
            }
			  
            for(int k=s2[i].y;k<=100;k++)  
            {  
                if(c[k])  
                {  
                    c[k]--;  //最合适的原则是:时间大于该任务且等级最低。检索完所有的任务即可得到结果。 
                    
					sum+=(s2[i].x*500+s2[i].y*2);  
                    cnt++;  
                    break;		//break可以帮助退出这一层循环!  
                }  
            } //就是要这么贪心滴! 
        }		  
        printf("%d %lld\n",cnt,sum);  
    }
	return 0;  
}  

 

  

 

转载于:https://www.cnblogs.com/dragondragon/p/11376708.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值