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