#P1115. Statistical Trouble
Statistical Trouble
本题没有可用的提交语言。
描述
你的团队受雇于国际公司 ACM(分析计算准则公司,Analytical Calculation Maxims)。每年,ACM 都会创建并开展各种调查。调查本身是简单的表格,包含一系列问题以及每个问题对应的一系列可能答案。这些调查在全球范围内分发,现场工作人员会对目标人群进行询问。所有的答案都被收集到 ICPC(国际计算与处理中心,International Computation and Processing Center),在那里,高薪聘请的分析师团队会对原始数据进行挖掘,以寻找相关的关联关系。对于每一项单独的调查,原始数据由许多行答案组成。每一行对应每一个被询问的人,并且对于每一个问题,都会列出该人在特定调查中给出的答案。
你的团队受雇来实现自动化的分析的第一步是创建交叉表,以关联有趣的问题对的答案。最简单的方式是,给定一对问题,交叉表的每一行对应第一个问题的每一个可能答案,每一列对应第二个问题的每一个可能答案。交叉表的每个单元格包含原始数据中同时具有对应问题的这两个答案的行数。
然而,你的任务较为复杂,因为你不仅要计算并输出简单的交叉表值,还要计算并输出交叉表中每一行和每一列的总计值(即对应行和列的值的总和),这些总计值放置在额外的最后一列和最后一行中,同时还要计算并输出每一行和每一列的百分比分布。一行的百分比分布是该行每个单元格中的一个额外数字,表示该单元格中的值占该行总计值的百分比,除非总计值为零(在这种情况下,该行的百分比分布未定义)。列的百分比分布也是如此。因此,你输出的交叉表中的每个单元格最多会有三个值(值本身、行百分比和列百分比)。请注意,百分比分布也适用于总计值。例如,对于每一行的总计列,行百分比将始终为 100%,除非该行的总计值为零(在这种情况下,行百分比未定义),而列百分比表示该行的总计值占原始数据总行数的百分比(该值可以在最后一行的最后一列中找到)。
输出时,百分比要四舍五入为整数。对于有非零小数部分的百分比,要四舍五入为大于结果百分比的最小整数或小于结果百分比的最大整数,这样做要保证所有相应的行的行百分比之和(不包括行总计)或所有相应的列的列百分比之和(不包括列总计)等于 100%,除非它们未定义。有多种四舍五入算法可以产生满足上述约束的结果。只要满足上述约束,你可以自由使用任何四舍五入算法。
输入
输入由三个部分组成:调查描述、调查结果和交叉表描述。
输入的第一行包含调查的名称,其长度最多为 个字符。接下来的行描述了调查中的所有问题。每个问题的第一行包含一个 字符的问题代码(仅包含大写字母和数字),后面跟一个空格,再后面是问题名称,其长度最多为 个字符。每个问题的后续行描述了该问题的一个可能答案,并且以一个空格开头,后面跟一个单字符的答案代码(大写字母、数字或字符 '.'、'*' 或 '@'),再后面跟一个空格和答案描述,答案描述的长度最多为 个字符。问题列表以仅包含单个字符 '#' 的行结束。每个问题中的所有答案代码都是唯一的,并且输入文件中的所有问题代码都是唯一的。每个问题至少有 个且最多有 个可能答案,并且至少有 个且最多有 个问题。
输入文件中的接下来的行描述调查结果。每一行包含对应每个问题的一个字符(按照它们在输入文件中出现的顺序),该字符给出了相应问题的答案代码。这些字符彼此相连,没有任何分隔符。这一部分以仅包含单个字符 '#' 的行结束。这一部分中至少有一行答案,并且答案总数最多为 个(行数乘以问题数)。
输入中的接下来的行描述要创建的交叉表。每个交叉表描述占一行。该行包含第一个问题的代码,后面跟一个空格,再后面是不同的第二个问题的代码,后面跟一个空格,最后是交叉表的名称,其长度最多为 个字符。这一部分以仅包含单个字符 '#' 的行结束。输入文件中最多有 个交叉表描述。
输入的任何一行都没有尾随空格。所有名称的开头和结尾都没有空格,但可能包含空格。
输出
按照输入文件中交叉表描述出现的顺序,为输入文件中的每个交叉表描述输出一个交叉表。在交叉表的第一行,写出调查名称,后面跟一个空格,再后面跟一个 '-'(破折号)字符,后面跟一个空格,最后是交叉表名称。然后按照它们在输入文件中出现的格式,准确写出第一个问题的描述和第二个问题的描述。然后写入一个空行,后面是交叉表本身。
该表恰好包含 行,并且每行恰好包含 个字符,其中 是第一个问题的可能答案的数量, 是第二个问题的可能答案的数量。该表有一行用于列标题,以及 行(每行 3 行)。这些行中的前 行对应于第一个问题的答案,顺序与它们在输入文件中出现的顺序相同,最后一行是列总计。该表也有 列,其中每列宽 6 个字符。第一列用于行标题;随后的 列对应于第二个问题的答案,顺序与它们在输入文件中出现的顺序相同,最后一列是行总计。单元格中的所有信息(包括标题)都向右对齐,并在左侧用空格填充,使其宽度达到 个字符。
第一列的标题为空。随后 列的标题由第二个问题代码、后面跟一个 ':'(冒号)字符,再后面跟相应的答案代码组成。最后一列的标题是字符串 "TOTAL"(不含引号)。交叉表的前 个 3 行的行的标题由第一个问题代码、后面跟一个 ':'(冒号)字符,再后面跟相应的答案代码组成。最后一行的标题是字符串 "TOTAL"(不含引号)。行标题位于相应行的第一行。每行的标题列中的随后 行必须为空。
表中的所有非标题单元格都包含计算出的值和百分比。每个单元格的第一行是相应的交叉表整数值。第二行包含正确四舍五入为整数的行百分比,带有强制的尾随 '%'(百分号)字符,如果相应的行百分比未定义,则为单个 '-'(破折号)字符。第三行以相同的格式包含列百分比。输出文件中的所有交叉表必须由一个空行分隔。
输入示例
New Year Phone Survey for ACM ICPC
Q01 Hello!
H Hello!
Y Yes!
* Uhm...
. (silence)
@ (other)
Q02 How are you?
H Hello!
Y Yes!
F Fine!
Q Who are you?
@ (other)
BYE Happy New Year!
Y You too.
* (censored)
@ (other)
. (hang up)
#
.@.
HH@
.@.
YFY
HQ*
H@.
YYY
.H@
HFY
HH@
#
Q01 Q02 Health vs greeting style
Q02 BYE Politeness matrix
#
输出示例
New Year Phone Survey for ACM ICPC - Health vs greeting style
Q01 Hello!
H Hello!
Y Yes!
* Uhm...
. (silence)
@ (other)
Q02 How are you?
H Hello!
Y Yes!
F Fine!
Q Who are you?
@ (other)
Q02:H Q02:Y Q02:F Q02:Q Q02:@ TOTAL
Q01:H 2 0 1 1 1 5
40% 0% 20% 20% 20% 100%
66% 0% 50% 100% 33% 50%
Q01:Y 0 1 1 0 0 2
0% 50% 50% 0% 0% 100%
0% 100% 50% 0% 0% 20%
Q01:* 0 0 0 0 0 0
- - - - - -
0% 0% 0% 0% 0% 0%
Q01:. 1 0 0 0 2 3
33% 0% 0% 0% 67% 100%
34% 0% 0% 0% 67% 30%
Q01:@ 0 0 0 0 0 0
- - - - - -
0% 0% 0% 0% 0% 0%
TOTAL 3 1 2 1 3 10
30% 10% 20% 10% 30% 100%
100% 100% 100% 100% 100%
New Year Phone Survey for ACM ICPC - Politeness matrix
Q02 How are you?
H Hello!
Y Yes!
F Fine!
Q Who are you?
@ (other)
BYE Happy New Year!
Y You too.
* (censored)
@ (other)
. (hang up)
BYE:Y BYE:* BYE:@ BYE:. TOTAL
Q02:H 0 0 3 0 3
0% 0% 100% 0% 100%
0% 0% 100% 0% 30%
Q02:Y 1 0 0 0 1
100% 0% 0% 0% 100%
33% 0% 0% 0% 10%
Q02:F 2 0 0 0 2
100% 0% 0% 0% 100%
67% 0% 0% 0% 20%
Q02:Q 0 1 0 0 1
0% 100% 0% 0% 100%
0% 100% 0% 0% 10%
Q02:@ 0 0 0 3 3
0% 0% 0% 100% 100%
0% 0% 0% 100% 30%
TOTAL 3 1 3 3 10
30% 10% 30% 30% 100%
100% 100% 100% 100% 100%
来源
2001年东北欧地区竞赛