P1013 [NOIP1998 提高组] 进制位の题解
P1013 [NOIP1998 提高组] 进制位
1w提交的题目甚至可以写题解!
此题解面向萌新,没有高深的公式,自然不够严谨,大佬请出门左转离开。
题目传送门,和一些更好的体验。
其实就是一个找规律的题目:
首先,在输出样例可以看到不同字母必须代表不同数字的字样,这就代表这每个字母所代表的数字都是不同的数字,自然而然的就知道了进制为 + 号,其实也就是字母的总数量)。
其次,代表数的关系不好讲,就上一张九九加法表就知道了。
从列看,每一列有几个二位数这个数就是多少,同时自己再想几个验证一下,也能轻易的发现这个规律,所以,只要根据这两个结论就可以得出结果。
判断 ERROR!也简单,先初步判断出来之后再一位一位的判断就可以了,大概伪代码如下:
int c;
if(当前位置是一位数){
c = 当前位置的字符串第一项的值;
}else{
c = 当前位置的字符串第一项的值*(n-1)+当前位置的字符串第二项的值;
}
if (c != 当前位置的两个加数和) {
cout << "ERROR!" << endl; //你愿意话用printf当然可以
return 0;//结束,免得之后再输出
}
剩下的就都没有任何难度了。
上代码!
AC Code
// 其实下面的p可以和m省略,但是m是后来偷懒写的,就没去合并了
#include <bits/stdc++.h>
using namespace std;
int n;
string s[15][15];
map<char, int> m;
int p[15];
int main() {
cin >> n;
for (int i = 1; i <= n; ++i)
for (int j = 1; j <= n; ++j)
cin >> s[i][j];
for (int i = 2; i <= n; ++i) {
int sum = 0;
for (int j = 1; j <= n; ++j)
if (s[i][j].size() == 2)
sum++;
p[i] = sum;
m.insert({s[i][1][0], sum});
}
for (int i = 2; i <= n; ++i)
for (int j = 2; j <= n; ++j) {
int a = p[i];
int b = p[j];
int c;
if (s[i][j].size() == 2)
c = m[s[i][j][0]] * (n-1) + m[s[i][j][1]];
else
c = m[s[i][j][0]];
if (c != a + b) {
cout << "ERROR!" << endl;
return 0;
}
}
for (int i = 2; i <= n; ++i)
cout << s[i][1] << "=" << p[i] << " ";
cout << endl << n - 1;
return 0;
}