NOIP2014提高組第四題 蟲食算

2021-07-26 10:06:25 字數 2450 閱讀 1882

蟲食算

問題描述

所謂蟲食算,就是原先的算式中有一部分被蟲子啃掉了,需要我們根據剩下的數字來判定被啃掉的字母。來看乙個簡單的例子:

43#9865#045

+8468#6633

44445509678

其中#號代表被蟲子啃掉的數字。根據算式,我們很容易判斷:第一行的兩個數字分別是5和3,第二行的數字是5。

現在,我們對問題做兩個限制:

首先,我們只考慮加法的蟲食算。這裡的加法是n進製加法,算式中三個數都有n位,允許有前導的0。

其次,蟲子把所有的數都啃光了,我們只知道哪些數字是相同的,我們將相同的數字用相同的字母表示,不同的數字用不同的字母表示。如果這個算式是n進製的,我們就取英文本母表午的前n個大寫字母來表示這個算式中的0到n-1這n個不同的數字:但是這n個字母並不一定順序地代表0到n-1)。輸入資料保證n個字母分別至少出現一次。

badc

dccc 上面的算式是乙個4進製的算式。很顯然,我們只要讓abcd分別代表0123,便可以讓這個式子成立了。你的任務是,對於給定的n進製加法算式,求出n個不同的字母分別代表的數字,使得該加法算式成立。輸入資料保證有且僅有一組解

分析

這題直接暴力搜尋肯定會超時,所以在搜尋過程中我們要加點優化:如果當前有一列的數都知道了,那麼判斷一下,如果不合法(1+1=0)就退出。

**

vars1,s2,s3:ansistring;

a:array['a'..'z'] of longint;

b:array[0..26] of char;

f:array[1..26] of boolean;

n,i,j:longint;

function check1:boolean;

vari,g:longint;

begin

check1:=true;

g:=0;

for i:=n downto 1 do

if (a[s1[i]]<>-1) and (a[s2[i]]<>-1) and (a[s3[i]]<>-1) then

if ((a[s1[i]]+a[s2[i]]) mod n<>a[s3[i]]) and ((a[s1[i]]+a[s2[i]]+1) mod n<>a[s3[i]])

then exit(false)

end;

function check2:boolean;

vari,x:longint;

begin

x:=0;

check2:=true;

for i:=n downto 1 do

begin

x:=x+a[s1[i]]+a[s2[i]];

if x mod n<>a[s3[i]] then exit(false);

x:=x div n;

end;

end;

procedure print;

vari:char;

begin

for i:='a' to chr(64+n) do

write(a[i],' ');

halt;

end;

procedure dfs(dep:longint);

vari:longint;

begin

if not check1 then exit;

if dep>n then if check2 then print;

for i:=n-1 downto 0 do

if not f[i] then

begin

f[i]:=true;

a[b[dep]]:=i;

dfs(dep+1);

f[i]:=false;

a[b[dep]]:=-1;

end;

end;

begin

readln(n);

readln(s1);

readln(s2);

readln(s3);

for i:=n downto 1 do

begin

if a[s1[i]]<>-1 then

begin

inc(j);

b[j]:=s1[i];

a[s1[i]]:=-1;

end;

if a[s2[i]]<>-1 then

begin

inc(j);

b[j]:=s2[i];

a[s2[i]]:=-1;

end;

if a[s3[i]]<>-1 then

begin

inc(j);

b[j]:=s3[i];

a[s3[i]]:=-1;

end;

end;

dfs(1);

end.

子矩陣(NOIP2014 普及組第四題)

給出如下定義 子矩陣 從乙個矩陣當中選取某些行和某些列交叉位置所組成的新矩陣 保持行與 列的相對順序 被稱為原矩陣的乙個子矩陣。例如,下面左圖中選取第 2 4 行和第 2 4 5 列交叉位置的元素得到乙個 2 3 的子矩陣如右圖所示。相鄰的元素 矩陣中的某個元素與其上下左右四個元素 如果存在的話 是...

NOIP2014提高組模擬題 8 9

一 最大配對 題意 給兩個序列,要求選k組,每組從兩個序列中各選乙個數,要使各組數的差的和最大。小論 兩個序列分別排序。每次用乙個序列的最大的減另乙個序列的最小的。當時情況 估計100分,結果50分。雖然題目有提醒答案可能超過2 31 1,我也看到了,但想著等下打完再改,於是我打著打著就忘了 最後掛...

noip2014 提高組題解 equation

題目大意 給定高次方程an x n a1 x 1 a0 0 求 1,m 區間內有多少個整數根 ai 10 10000,m 1000000,n 100 首先,在考試的時候由於我很弱,一看到ai的範圍我就傻了,果斷30分騙起 解題思路 1.30分 30分很好騙,直接暴力就行了 2.60分 因為我考試的時...