问题描述

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

L K V E

L L K V E

K K V E KL

V V E KL KK

E E KL KK KV

其含义为:

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(n≤9)表示行数。

以下n行,每行包括n个字符串,每个字串间用空格隔开。(字串仅有一个为‘+’号,其它都由大写字母组成)

输出格式

① 各个字母表示什么数,格式如:L=0,K=1,……按给出的字母顺序。

② 加法运算是几进制的。

③ 若不可能组成加法表,则应输出“ERROR!”

样例输入

5

L K V E

L L K V E

K K V E KL

V V E KL KK

E E KL KK KV

样例输出

L=0 K=1 V=2 E=3

4

解析

看到这道题时,有没有想到搜索?然后就是一通码......然后过了。

但是,真的要用搜索吗?

我们可以观察一下。对于n进制中的数\(i\),如果\(i\)加上某一个数\(j\)会变成两位数,那么可以得到如下不等式:

\[i+j>n-1 \Rightarrow j>n-1-i
\]

而满足要求的\(j\)的个数有\(n-1-(n-1-i)=i\)个。由此我们可以得到结论,一个字母的值就是这个字母对应的行中两位数的个数。我们所需要做的只是验证是否正确。那么怎样验证呢?最直接的办法是直接往里面代,但能否用另外的方法将每个字母的值算出呢?

这个比较难想。对于一个数\(i\),如果想要\(j+k\)的个位数为\(i\),必须满足\(i<k<n\)。那么,假设满足条件的\(k\)有\(a[i]\)个,\(i\)的值就是\(n-1-a[i]\)。\(a[i]\)只用求一个字母在两位数的个位上出现的次数即可。

另外,如果一个数在同一行中出现了两次,显然也是不对的,直接结束即可。

在下面的代码中,因为行数是\(n\),所以其实是\(n-1\)进制的加法。

代码

#include <iostream>
#include <cstdio>
#include <string>
#define N 10
using namespace std;
int n,i,j,a[N],num[30];
char l[N];
int main()
{
cin>>n;
for(i=0;i<n;i++){
char c;
cin>>c;
if(c!='+') l[i]=c;
}
for(i=2;i<=n;i++){
string s1,s;
for(j=1;j<=n;j++){
cin>>s;
if(j==1) continue;
if(j!=2&&s==s1){
cout<<"ERROR!"<<endl;
return 0;
}
s1=s;
if(i!=1&&j!=-1){
int l=s.length();
if(l==2){
a[i-1]++;
num[(int)s[l-1]]++;
}
}
}
}
for(i=1;i<n;i++){
if(a[i]!=n-2-num[(int)l[i]]){
cout<<"ERROR!"<<endl;
return 0;
}
}
for(i=1;i<n;i++){
cout<<l[i]<<"="<<a[i]<<' ';
}
cout<<endl<<n-1<<endl;
return 0;
}

[洛谷 P1013] NOIP1998 提高组 进制位的更多相关文章

  1. P1013 [NOIP1998 提高组] 进制位

    解析 看到这道题时,有没有想到搜索?然后就是一通码......然后过了. 但是,真的要用搜索吗? 我们可以观察一下.对于n进制中的数ii,如果ii加上某一个数jj会变成两位数,那么可以得到如下不等式: ...

  2. 【洛谷p1066】2^k进制数

    (不会敲键盘惹qwq) 2^k进制数[传送门] 算法标签: (又是一个提高+省选-的题) 如果我说我没听懂你信吗 代码qwq: #include<iostream> #include< ...

  3. 洛谷 P2678 & [NOIP2015提高组] 跳石头

    题目链接 https://www.luogu.org/problemnew/show/P2678 题目背景 一年一度的“跳石头”比赛又要开始了! 题目描述 这项比赛将在一条笔直的河道中进行,河道中分布 ...

  4. 【题解】洛谷P1066 [NOIP2006TG] 2^k进制数(复杂高精+组合推导)

    洛谷P1066:https://www.luogu.org/problemnew/show/P1066 思路 挺难的一道题 也很复杂 满足题目要求的种数是两类组合数之和 r的最多位数m为 w/k(当w ...

  5. 洛谷 题解 P1604 【B进制星球】

    题目:P1604 B进制星球 本人提交记录:R6292872 作为一个极其无聊的人,我没事干地写了operator... 思路很简单: 读入b 读入b进制的x,y ans = x + y 输出ans ...

  6. 洛谷 P1025 & [NOIP2001提高组] 数的划分(搜索剪枝)

    题目链接 https://www.luogu.org/problemnew/show/P1025 解题思路 一道简单的dfs题,但是需要剪枝,否则会TLE. 我们用dfs(a,u,num)来表示上一个 ...

  7. 洛谷P1514 [NOIP2010提高组T4]引水入城

    P1514 引水入城 题目描述 在一个遥远的国度,一侧是风景秀美的湖泊,另一侧则是漫无边际的沙漠.该国的行政区划十分特殊,刚好构成一个N 行M 列的矩形,如上图所示,其中每个格子都代表一座城市,每座城 ...

  8. 洛谷P1084 [NOIP2012提高组Day2T3]疫情控制

    P1084 疫情控制 题目描述 H 国有 n 个城市,这 n 个城市用 n-1 条双向道路相互连通构成一棵树,1 号城市是首都,也是树中的根节点. H 国的首都爆发了一种危害性极高的传染病.当局为了控 ...

  9. 洛谷P1083 [NOIP2012提高组Day2T2]借教室

    P1083 借教室 题目描述 在大学期间,经常需要租借教室.大到院系举办活动,小到学习小组自习讨论,都需要向学校申请借教室.教室的大小功能不同,借教室人的身份不同,借教室的手续也不一样. 面对海量租借 ...

随机推荐

  1. c#枚举类型操作方法总结-1

    关于枚举类型用法总结两点,分享如下: 1.  根据枚举值获取枚举值的描述信息,可以封装一个方法供调用: //  enumValue是传入的枚举值 public string GetEnumDescrp ...

  2. React-Native 之 GD (二十一)APP 打包

    1.生成一个签名密钥: 在 /android/app 下运行 说明:keytool -genkey -v -keystore my-release-key.keystore -alias my-key ...

  3. 抓取某高校附近共享单车位置,并使用web方式展示过去几天的位置变化

    效果如图 使用了高德地图API:https://lbs.amap.com/api/javascript-api/example/marker/massmarks js代码如下: function Ma ...

  4. Python解决NameError: name 'reload' is not defined的问题

    遇到这个问题,对于 Python 2.X: import sys reload(sys) sys.setdefaultencoding("utf-8") 对于 Python 3.3 ...

  5. 详细解析arry.map() ,function.apply() 方法

    首先转载一篇博文:关于map 和callbackfn 的一些参数和返回值可以查看以下链接. http://www.cnblogs.com/xuan52rock/p/4460938.html array ...

  6. python基础-4 函数参数引用、lambda 匿名函数、内置函数、处理文件

    上节课总结 1.三元运算 name=“name1”if 条件 else “name2” 2.深浅拷贝 数字.字符串 深浅,都一样 2.其他 浅拷贝:只拷贝第一层 深拷贝:不拷贝最后一层 3.set集合 ...

  7. mybatis加载配置文件详解

    spring整合Mybatis后,SqlSessionFactory的创建由spring进行了代理,以下是SqlSessionFactory创建的流程 SqlSessionFactoryBean: p ...

  8. 分支结构 :if - else

    分支结构 :if - else 格式一: if(条件表达式){ 执行语句; } 格式二:二选一 if(条件表达式){ 执行语句1; }else{ 执行语句2; } 格式三: 多选一 if(条件表达式1 ...

  9. 洛谷 P2024 [NOI2001]食物链(种类并查集,加权并查集)

    传送门 解题思路 加权并查集: 什么是加权并查集? 就是记录着每个节点到它的父亲的信息(权值等). 难点:在路径压缩和合并节点时把本节点到父亲的权值转化为到根节点的权值 怎么转化呢? 每道题都不一样Q ...

  10. BZOJ 1878(离散化+线段树)

    题面 传送门 分析 首先我们观察到区间范围较大,而区间个数较少,考虑离散化,将所有询问按照右端点进行排序 离散化之后研究区间颜色个数变化的规律 当我们处理到第a[i]个段时,设a[i]上一次出现的地方 ...