http://acm.pku.edu.cn/JudgeOnline/problem?id=1115
Код:
#include <stdio.h>
#include <string.h>
#define E 0.0000000001
char survey[256];
struct question {
union {
char code[4];
unsigned c;
};
char q[100];
int na;
struct answer {
char a[48];
char code;
} a[10];
} q[100];
int nq;
int lq;
int nr;
char r[10000][104];
int num[12][12];
double pfh[12][12];
int pih[12][12];
double pfv[12][12];
int piv[12][12];
int t1[128],t2[128];
int main()
{
char line[256];
gets(survey);
nq=0;
lq=-1;
for(;;)
{
gets(line);
if(line[0]=='#') break;
if(line[0]==' ')
{
q[lq].a[q[lq].na].code = line[1];
strcpy(q[lq].a[q[lq].na].a, line+3);
q[lq].na++;
}
else {
lq=nq;
nq++;
line[3]=0;
memcpy(q[lq].code,line,4);
strcpy(q[lq].q,line+4);
q[lq].na=0;
}
}
nr=0;
for(;;)
{
gets(r[nr]);
if(r[nr][0]=='#') break;
nr++;
}
for(;;)
{
int q1,q2;
int i1,i2;
int i,j,k;
gets(line);
if(line[0]=='#') break;
line[3]=0;
line[7]=0;
q1=((unsigned*)line)[0];
q2=((unsigned*)line)[1];
for(i=0;i<nq;i++)
{
if(q[i].c==q1) i1=i;
if(q[i].c==q2) i2=i;
}
printf ("%s - %s\n", survey, line+8);
printf ("%s %s\n", q[i1].code, q[i1].q);
for(i=0;i<q[i1].na;i++)
printf(" %c %s\n", q[i1].a[i].code, q[i1].a[i].a);
printf ("%s %s\n", q[i2].code, q[i2].q);
for(i=0;i<q[i2].na;i++)
printf(" %c %s\n", q[i2].a[i].code, q[i2].a[i].a);
printf("\n");
for(i=0;i<=q[i1].na;i++)
for(j=0;j<=q[i2].na;j++)
num[i][j]=0;
/* create translation table (code -> index) */
for(i=0;i<128;i++)
{
t1[i]=q[i1].na;
t2[i]=q[i2].na;
}
for(i=0;i<q[i1].na;i++)
t1[q[i1].a[i].code]=i;
for(i=0;i<q[i2].na;i++)
t2[q[i2].a[i].code]=i;
for(k=0;k<nr;k++)
num[t1[r[k][i1]]][t2[r[k][i2]]]++;
/* sum the numbers*/
for(i=0;i<q[i1].na;i++)
{
num[i][q[i2].na]=0;
for(j=0;j<q[i2].na;j++)
num[i][q[i2].na]+=num[i][j];
}
for(i=0;i<=q[i2].na;i++)
{
num[q[i1].na][i]=0;
for(j=0;j<q[i1].na;j++)
num[q[i1].na][i]+=num[j][i];
}
/* compute the per cents */
for(i=0;i<=q[i1].na;i++)
if(num[i][q[i2].na])
{
for(j=0;j<q[i2].na;j++)
pfh[i][j]=100 * (double)num[i][j] / num[i][q[i2].na];
pfh[i][q[i2].na]=100;
pih[i][q[i2].na]=100;
}
for(j=0;j<=q[i2].na;j++)
if(num[q[i1].na][j])
{
for(i=0;i<q[i1].na;i++)
pfv[i][j]=100 * (double)num[i][j] / num[q[i1].na][j];
pfv[q[i1].na][j]=100;
piv[q[i1].na][j]=100;
}
/* round the per cents */
for(i=0;i<=q[i1].na;i++)
if(num[i][q[i2].na])
{
k=0;
for(j=0;j<q[i2].na;j++)
{
pih[i][j]=pfh[i][j];
k+=pih[i][j];
}
for(j=0;k<100 && j<q[i2].na;j++)
if((pfh[i][j] - (double)pih[i][j]) > E)
{
pih[i][j]++;
k++;
}
}
for(j=0;j<=q[i2].na;j++)
if(num[q[i1].na][j])
{
k=0;
for(i=0;i<q[i1].na;i++)
{
piv[i][j]=pfv[i][j];
k+=piv[i][j];
}
for(i=0;k<100 && i<q[i1].na;i++)
if((pfv[i][j] - (double)piv[i][j]) > E)
{
piv[i][j]++;
k++;
}
}
/* print the table */
printf (" ");
for(j=0;j<q[i2].na;j++)
printf (" %s:%c", q[i2].code, q[i2].a[j].code);
printf (" TOTAL\n");
for(i=0;i<=q[i1].na;i++)
{
if (i<q[i1].na)
printf (" %s:%c", q[i1].code, q[i1].a[i].code);
else
printf (" TOTAL");
for(j=0;j<=q[i2].na;j++)
printf("%6d",num[i][j]);
printf("\n");
printf (" ");
if(num[i][q[i2].na])
for(j=0;j<=q[i2].na;j++)
printf("%5d%%", pih[i][j]);
else
for(j=0;j<=q[i2].na;j++)
printf(" -");
printf("\n");
printf (" ");
for(j=0;j<=q[i2].na;j++)
if(num[q[i1].na][j])
printf("%5d%%", piv[i][j]);
else
printf(" -");
printf("\n");
}
printf("\n");
}
return 0;
}