服务员-dp

来源:互联网 发布:和明星合影软件 编辑:程序博客网 时间:2024/04/28 18:47

题意:服务员要服务每个顾客,顾客在订蛋糕后,要求服务员把蛋糕分成一份。对于蛋糕总体积(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;}