- 论坛徽章:
- 1
|
思想:
设立7个累加器的数组。
求每人钱的平均数,
面额排序,并且从大值开始取,
每轮总是从累加值最小的开始依次发放,
加上当前面额大于平均限定值的要跳过。
根据上面说的思想,写了一个C程序。
程序接受一个值列表文件,一个值一行,
编译后的命令行格式:
./a.out -n7 sample
sample 就是值列表文件,
例如可以象下面的样子:
12
45
67
123
.
.
.
-n7 表示分成7份,可以改成其它值。
输出的第一列是和,冒号后面则是分配的值。
下面附C源码,编译通过,故意隐去显式信息,难读些,但表现不错
实现:
#include <sys/types.h>
#include <ctype.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
char z7a2b2[]={"\
Usage:把一系列的值均分若干份,使每份之间的差最小\n\
zaver [s_file] [o_file] [-n7]\n\
-nxx 分组数,十进数\n\
zaver -h\n\
zaver -?\n\
"};
#define z05c7d 10
#define z01200 0x100
char z3455f[z01200];
FILE *z678be;
FILE *z6c33b;
FILE *z70db8;
typedef struct z424d6 zad611;
struct z424d6 { long z2b065;
};
zad611 *z837ac;
int z88229;
typedef struct zf7de1 zfc85e;
struct zf7de1 { int zee8e7;
int *za8b94;
int zf3364;
};
zfc85e *z13bf4;
int zbb588 = 0;
int *z18671;
int zc0005;
int z9ac1d = 0;
z62e41(z5044d, z54eca)
unsigned long *z5044d;
unsigned long *z54eca;
{
if(*z5044d == *z54eca) return 0;
if(*z5044d > *z54eca) return 1;
else return -1;
}
z21b6b(z9f69a, z2fae2)
char *z9f69a;
zad611 *z2fae2;
{ char *ze0970, *z46f53, z38fdc;
int z3da59;
char zb208e[z01200];
char *zc94ff[z05c7d];
long zdbef3;
ze0970 = z9f69a;
z46f53 = zb208e;
while((z38fdc = *ze0970++) != 0)
{ if(z38fdc == '\n') break;
if(z38fdc == '\t') z38fdc = ' ';
*z46f53++ = z38fdc;
}
*z46f53 = 0;
z3da59 = 1;
zc94ff[0] = 0;
ze0970 = zb208e;
while(*ze0970 == ' ') ze0970++;
zc94ff[z3da59++] = ze0970;
if(z3da59+1 >= z05c7d)
{ fprintf(stderr,"too much fields in a z9f69a!" ;
exit(1);
}
while((*ze0970 != ' ')&& *ze0970) ze0970++;
*ze0970++ = 0;
zc94ff[z3da59] = 0;
sscanf(zc94ff[1], "%ld", &zdbef3);
z2fae2->z2b065 = zdbef3;
return;
}
zcdf7c()
{ int z7ed2f, z8cca6, z265e8, z4b9d0, zd7476;
z18671 = (int *)calloc(zc0005, sizeof(int) * zbb58 ;
z13bf4 = (zfc85e *)calloc(sizeof(struct zf7de1), zbb58 ;
for(z8cca6=zbb588-1; z8cca6 >= 0; z8cca6--)
{ z13bf4[z8cca6].zee8e7 = 0;
z13bf4[z8cca6].za8b94 = (int *)(z18671 + z8cca6*zc0005);
}
z4b9d0 = z88229 - 1;
while(z4b9d0 >= 0)
{ zd7476 = 0;
for(z8cca6=0; z8cca6 <zbb588; z8cca6++)
{ z265e8 = z837ac[z4b9d0].z2b065;
if((z13bf4[z8cca6].zee8e7 + z265e <= z9ac1d)
{ zd7476 = 1;
z13bf4[z8cca6].zee8e7 += z265e8;
*(z13bf4[z8cca6].za8b94 + z13bf4[z8cca6].zf3364++) = z837ac[z4b9d0].z2b065;
if((--z4b9d0) < 0) break;
if(z13bf4[z8cca6].zf3364 > zc0005 - 1)
{ free(z18671);
free(z13bf4);
return(1);
}
}
}
if(zd7476 == 0)
{ z4b9d0--;
free(z18671);
free(z13bf4);
return(2);
}
qsort(z13bf4, zbb588, sizeof(struct zf7de1), &z62e41);
}
free(z18671);
free(z13bf4);
return(0);
}
zd29f9()
{ int zd7476, ze9e6a;
int z961a0 = 0;
while(1)
{ zd7476 = zcdf7c();
if(zd7476 == 1)
{ zc0005 += 2;
continue;
}
if(zd7476 == 2)
{ z9ac1d += (z9ac1d/20);
continue;
}
if(zd7476 == 0)
{ if(z9ac1d > (z13bf4[zbb588-1].zee8e7 - 1))
{ z961a0 = z9ac1d;
z9ac1d = z13bf4[zbb588-1].zee8e7 - 1;
ze9e6a = zcdf7c();
if(ze9e6a == 1)
{ zc0005 += 2;
continue;
}
else if(ze9e6a == 2)
{ z9ac1d = z961a0;
break;
}
}
}
}
}
main(z0a6fa,z1d0ee)
int z0a6fa;
char *z1d0ee[];
{ int z7ed2f,z8cca6,z91723;
char *zc4a82, *ze0970, z38fdc;
char *z0f177[z05c7d];
zad611 z75835;
int z4b9d0, z265e8, z3da59;
int za4117, zd7476;
ulong ze53ed;
z8cca6 = 0;
for(z7ed2f = 1; z7ed2f < z0a6fa; z7ed2f++)
{ zc4a82 = z1d0ee[z7ed2f];
if(*zc4a82 != '-')
zb6b0b:{ z0f177[z8cca6++] = z1d0ee[z7ed2f];
}
else
{ z91723 = 1;
switch(*(zc4a82 + 1))
{ case 0: goto zb6b0b;
case 'n':
sscanf(*(zc4a82+2)? zc4a82+2 :z1d0ee[++z7ed2f],"%ld",&zbb58 ;
break;
default:fprintf(stderr,"不支持的选项!\n" ;
case '?':
case 'h':goto z5e3c4;
}
}
}
switch(z8cca6)
{ case 2: if((z6c33b=fopen(z0f177[1],"w" )== NULL)
{ fprintf(stderr,"can't open %s\n",z0f177[1]);
exit(1);
}
case 1: if((z678be=fopen(z0f177[0],"r" )== NULL)
{ fprintf(stderr,"can't open %s\n",z0f177[0]);
exit(1);
}
if(z8cca6==1) goto z59947;
break;
case 0: z678be = stdin;
z59947: z6c33b = stdout;
break;
default:fprintf(stderr,"paramter too much!\n" ;
z5e3c4: fprintf(stderr,"%s\n",z7a2b2);
exit(1);
}
for(z7ed2f=0; (fgets(z3455f,z01200,z678be)!=NULL); z7ed2f++);
z7ed2f++;
za4117 = z7ed2f;
z837ac = (zad611 *)malloc(sizeof(zad611) * (z7ed2f + 2));
if(z837ac == 0)
{ fprintf(stderr,"no enough memory\n" ;
exit(1);
}
fseek(z678be,0l,0);
z3da59 = 0;
z88229 = 0;
ze53ed = 0;
while(fgets(z3455f,z01200,z678be) != NULL)
{ if(z3455f[0] == '\n') continue;
ze0970 = z3455f;
if(*ze0970 == 'z') ze0970++;
z21b6b(ze0970,&z75835);
z837ac[z88229].z2b065 = z75835.z2b065;
z88229++;
if(z88229 >= za4117)
{ printf("z837ac fulled exit!\n" ;
exit(1);
}
z3da59++;
ze53ed += z75835.z2b065;
}
qsort(z837ac, z88229, sizeof(struct z424d6), &z62e41);
if((zbb588==0) && (z9ac1d==0))
{ fprintf(stderr, "必须用 -n 选项指定分组数!" ;
exit(1);
}
if(z9ac1d==0) z9ac1d = ze53ed/zbb588 + ze53ed/(zbb588*20);
else if(zbb588==0) zbb588 = ze53ed/z9ac1d;
if(zc0005==0) zc0005 = 2 + z3da59 / (zbb588-1);
if(z9ac1d < z837ac[z88229-1].z2b065)
{ z9ac1d = z837ac[z88229-1].z2b065;
}
zd29f9();
z18671 = (int *)calloc(zc0005, sizeof(int) * zbb58 ;
z13bf4 = (zfc85e *)calloc(sizeof(struct zf7de1), zbb58 ;
for(z8cca6=zbb588-1; z8cca6 >= 0; z8cca6--)
{ z13bf4[z8cca6].zee8e7 = 0;
z13bf4[z8cca6].za8b94 = (int *)(z18671 + z8cca6*zc0005);
}
z4b9d0 = z88229 - 1;
while(z4b9d0 >= 0)
{ zd7476 = 0;
for(z8cca6=0; z8cca6 <zbb588; z8cca6++)
{ z265e8 = z837ac[z4b9d0].z2b065;
if((z13bf4[z8cca6].zee8e7 + z265e <= z9ac1d)
{ z13bf4[z8cca6].zee8e7 += z265e8;
*(z13bf4[z8cca6].za8b94 + z13bf4[z8cca6].zf3364++) = z837ac[z4b9d0].z2b065;
zd7476 = 1;
z4b9d0--;
if(z4b9d0 < 0) break;
}
}
qsort(z13bf4, zbb588, sizeof(struct zf7de1), &z62e41);
}
for(z7ed2f=0; z7ed2f<zbb588; z7ed2f++)
{
fprintf(z6c33b, "%08ld: ", z13bf4[z7ed2f].zee8e7);
for(z8cca6=0; z8cca6 < z13bf4[z7ed2f].zf3364; z8cca6++)
{
fprintf(z6c33b, "%08ld ", *(z13bf4[z7ed2f].za8b94 + z8cca6));
}
fprintf(z6c33b, "\n" ;
}
free(z18671);
free(z13bf4);
exit(0);
}
/* End of file */ |
|