A1119. 进位制表

1.0s   内存限制: 256.0MB  

​154​​   AC次数: 32   平均分: 27.60

将本题分享到:

           

​查看未格式化的试题​​​    ​​​提交​​​    ​​​试题讨论​

试题来源

  NOIP1998 提高组

问题描述

  著名科学家卢斯为了检查学生对进位制的理解,他给出了如下的一张加法表,表中的字母代表数字。 例如:


+LKVELLKVEKKVEKLVVEKLKKEEKLKKKV


  其含义为:

  L+L=L,L+K=K,L+V=V,L+E=E

  K+L=K,K+K=V,K+V=E,K+E=KL ……

  E+E=KV




  根据这些规则可推导出:L=0,K=1,V=2,E=3

  同时可以确定该表表示的是4进制加法

输入格式

  输入包含n+1行,第一行为n(n≤9)表示以下表格的行数。
  以下n行,每行包括n个字符串,每个字串间用空格隔开。(字串仅有一个为‘+’号,其它都由大写字母组成)

输出格式

  程序输出:
  第一行为各个字母表示什么数,格式如:L=0 K=1 ……
  按大写字母字典序升序输出,格式为:大写字母+‘=’+数字+一个空格……。
  第二行为加法运算是几进制的,即一个整数k
  若不可能组成加法表,则应输出“ERROR!”

解析:摘自卢嘉铭

/*

这道题看似很难...

但是这里的测例非常简单...

首先没有ERROR例,另外进制都是十进制以内,所以可以非常简单地处理;

 

输入是标准的加法表,仅仅是大小顺序有改变,也即第一行和第一列都是0...r-1这r个数

所以只需要判断第一列中每一个字母对应的每行产生进位的个数,即是字母对应的数字,由于测例简单,只实现这部分就可以通过了

*/

vijos1596跟着道题是一样的,好像数据加强了。但是我看了vijos上面的题解讨论,发现与我理解的有很大不同,我也没找到vijos的数据(现在也不能骗数据了),对此,我只能表示理解题意不能,所以vijos上的这道题我就不浪费时间去想题意了(通过率仅仅13%,读题难的不在少数啊)。

这道题我实在清橙(http://www.tsinsen.com/A1119###)上提交通过的,上面的就是当年noip的原始数据。


代码:

#include<cstdio>
#include<cstring>
#define maxn 10
using namespace std;
int n,a[30];
char s[15][15][maxn];
int main()
{
// freopen("1.in","r",stdin);
int i,j,k;
scanf("%d",&n);
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
scanf("%s",s[i][j]);
memset(a,90,sizeof(a));
for(i=2;i<=n;i++)
{
for(k=0,j=2;j<=n;j++)
if(strlen(s[i][j])>1)k++;
a[s[i][1][0]-'A']=k;
}
for(k=0,i=0;i<26;i++)if(a[i]!=a[29])
{
printf("%c=%d ",'A'+i,a[i]);
k++;
if(k<n-1)printf(" ");
}
printf("\n%d\n",n-1);
return 0;
}