列表

详情


NC16784. [NOIP1998]进制位

描述

著名科学家卢斯为了检查学生对进位制的理解,他给出了如下的一张加法表,表中的字母代表数字。 例如:
其含义为:L+L=L,L+K=K,L+V=V,L+E=E
K+L=K,K+K=V,K+V=E,K+E=K……E+E=KV
根据这些规则可推导出:L=0,K=1,V=2,E=3
同时可以确定该表表示的是4进制加法

输入描述

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

输出描述

①各个字母表示什么数,格式如:L=0,K=1,……按给出的字母顺序。
②加法运算是几进制的。
③若不可能组成加法表,则应输出“ERROR!”

示例1

输入:

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

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++14(g++5.4) 解法, 执行用时: 3ms, 内存消耗: 356K, 提交时间: 2018-09-09 15:19:50

#pragma GCC optmize("Ofast")
#include <bits/stdc++.h>

struct node
{
	std::string s;
	int ans;
	int da;
}t[10][10];
int n;
std::map<char, int> a;

inline std::string readString() {
    char buf[10];
    scanf("%s", buf);
    return std::string(buf);
}

int main() {
	int x;
	scanf("%d", &n);
	for (int i = 1; i <= n; i++)
		for (int j = 1; j <= n; j++)
			t[i][j].s = readString();
	for (int k = 2; k <= n; k++) {
		x = 0;
		for (int i = 2; i <= n; i++)
			for (int j = 2; j <= n; j++)
				if (t[i][j].s == t[1][k].s)
					x++;
		if (!x) return printf("ERROR!\n"), 0;
		t[k][1].ans = t[1][k].ans = a[t[k][1].s[0]] = x - 1;
	}
	for (int i = 2; i <= n; i++)
		for (int j = 2; j <= n; j++)
			t[i][j].ans = t[i][1].ans + t[1][j].ans;
	for (int i = 1; i <= n; i++)
		for (int j = 1; j <= n; j++) {
			x = t[i][j].s.length();
			if (x == 1) {
				t[i][j].da = a[t[i][j].s[0]];
				continue;
			}
			t[i][j].da = (n - 1)*a[t[i][j].s[0]] + a[t[i][j].s[1]];
		}
	for (int i = 1; i <= n; i++)
		for (int j = 1; j <= n; j++)
			if (t[i][j].ans != t[i][j].da) return printf("ERROR!\n"), 0;
	for (int i = 2; i <= n; i++){
	    const char *buf = t[1][i].s.data();
	    printf("%s=%d ", buf, t[1][i].ans);
	}
	printf("\n%d\n", n - 1);
	return 0;
}

C++11(clang++ 3.9) 解法, 执行用时: 4ms, 内存消耗: 504K, 提交时间: 2020-02-14 12:58:02

#include<bits/stdc++.h>
#define A 1000010
#define B 2010
using namespace std;
typedef long long ll;
int n;char a[A],re[A];
string c,cc;
map<char,int> m,mm;
int main()
{
	cin>>n;cin>>c;
	for(int i=1;i<=n-1;i++) cin>>c,a[i]=c[0];
	for(int i=1;i<=n-1;i++)
	for(int j=1;j<=n;j++)
	{
		cin>>c;
		if(j!=1 and j!=2 and c==cc) return puts("ERROR!"),0;
		cc=c;
		if(c.length()==2) m[a[i]]++,mm[c[1]]++; 
	}
	for(int i=1;i<=n-1;i++) if(m[a[i]]!=n-2-mm[a[i]]) return puts("ERROR!"),0;
	for(int i=1;i<=n-1;i++) printf("%c=%d ",a[i],m[a[i]]);puts(" ");
	cout<<n-1<<endl;return 0;
}

上一题