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; }