服务员-dp

29 篇文章 0 订阅
18 篇文章 0 订阅

题意:服务员要服务每个顾客,顾客在订蛋糕后,要求服务员把蛋糕分成一份。对于蛋糕总体积(n),每次分成开成两个部分,要花费n*(n-1),而后面又有顾客来订蛋糕,时间可能发生了冲突,为了服务更多的顾客,可以放弃花费时间多的顾客,以确保服务顾客数量最多。

第一组k,表示顾客的总人数。接下来是k组数据,每组两个,第一个是顾客到的时间,第二个是订的蛋糕体积。

输出最多服务顾客的总数。


分析:首先,要算出每个顾客花费的时间。然后,对其排序(从小到大)。过仔细分析,每次分成1和n-1,总时间将会最小。故有1*(n-1)+I*(n-2)+......1*1,所以t=n(n-1)/2;

然后,对每个服务时间终点进行排序就行了。

#include<cstdio>
#include<algorithm>
#include<iostream>
using namespace std;


struct node{
       int s,t,k;
       }f[100];


bool cmp(node a,node b)
{
     return a.k<b.k;
}


int main()
{    
    int n,i,end=0;
    while(scanf("%d",&n)!=-1)
    { 
     for(i=0;i<n;i++)
	 {
	  scanf("%d%d",&f[i].s,&f[i].t);
 	  f[i].k=f[i].t*((f[i].t)-1)/2+f[i].s;
	 }
       sort(f,f+n,cmp); 
	   int m=0;
      for(i=0;i<n;i++)
	  {   
       if(end<=f[i].s)
	   {
             if(f[i].s==f[i-1].s&&f[i].k==f[i-1].k)
	            continue;
		 end=f[i].k;
		     m++;
	   }
	  }
       printf("%d\n",m);
       }
      return 0;
} 


       
           

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值