/*
有一个简单的内存池,内存按大小细分
每个粒度都有一些可用的内存资源
用户将进行一系列的内存申请
需要根据需要分配内存池中的资源
返回申请结果的成功失败列表
分配规则如下
1 .分配大于或等于内存申请量的内存
如果有满足需要的内存,就必须分配
优先分配粒度小的,但内存不能分割使用
2 .需要按申请顺序分配
如果分配给先申请的先,并且有可用的内存分配,则申请结果为true
如果不可用,则返回false
注释:不考虑内存释放
输入说明
作为两行字符串输入
第一行内存池列表
包含存储器粒度数据信息,粒度数据之间用逗号分割
用冒号分割一个粒度信息内
冒号之前是内存的粒度,冒号之后是几个
资源列表小于或等于1024
单位粒度的数量在4096以下
第二行为申请列表
请求的内存大小由逗号分隔,请求列表不超过100000
例如
63:2、128:1、32:4和1:128
50、36、64、128和127
输出说明
向内存池输出分配结果
例如true、true、true、false、false
示例1 :
输入:
63:2、128:1、32:4和1:128
50、36、64、128和127
输出:
真,真,真,假,假
说明:
存储器池资源包括64k中2个、128k中1个、32k中4个、1k中128个存储器资源
对于50、36、64、128、127存储器申请序列,
分配的内存的顺序是64、64、128、null和null
因为在第三次申请内存时分配了128,所以输出结果是
真,真,真,假,假
*/
# include stdio.h # include string.h # include stdlib.h # include math.h # include ctype.h # definestr _ max _ len 100000 int cnt; }DataInfo; intCMP(constvoid*a,const void *b ) datainfo*x=) datainfo* ) a; datainfo*y=(datainfo* ) b; return x-size – y-size; } voidstrsqit (datainfo meminfo [ memory _ max _ count ],int num ) { char tmp[2][10]; for(intk=0; k num; k () { int i=0; char *p1=NULL; P1=strtok(meminfo[k].s,’ : ‘; wile(P1!=null ({ strcpy } tmp [ I ],p1 ); I; p1=strtok(null,’,’; }meminfo[k].size=atoi(tmp[0]; meminfo[k].cnt=atoi(tmp[1]; }}int main () { char str1[STR_MAX_LEN]; char str2[STR_MAX_LEN]; int list[MEMORY_MAX_COUNT]; int i=0; int j=0; datainfo meminfo [ memory _ max _ count ]; memset(meminfo,0,sizeof ) meminfo ); gets(str1; gets(str2; char *p1=NULL; char *p2=NULL; p1=strtok(str1,’,’; wile(P1!=null}{strcpy(meminfo[I].s,p1 ); I; p1=strtok(null,’,’; }strsqit(meminfo,I ); p2=strtok(str2,’,’; while(P2!=null({list[j]=atoi ) ) P2 ); j; p2=strtok(null,’,’; }qsort(meminfo,I,sizeof ) datainfo ),cmp ); /*for(intm=0; m i; m () printf(‘%d%d(n ),memInfo[m].size,memInfo[m].cnt ); }*/for(intm=0; mj; m ) { int flag=0; for(intn=0; 镍; n () if ) meminfo[n].cnt1 ) { continue; (if ) meminfo[n].sizelist[m] ) { flag=1; memInfo[n].cnt–; 黑; }if(flag==1) printf ) ) ture ); }else{printf(‘false ); (if ) mj-1 ) { printf ),); (else ) printf ((n ); } } return 0; }