luogu1092蟲食算 未AC,待續中

2021-08-01 20:35:49 字數 1709 閱讀 3262

題目描述

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

43#9865#045

+8468#6633

———————

44445509678

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

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

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

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

badc

cbda

dccc

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

輸入輸出格式

輸入格式:

包含四行。第一行有乙個正整數n(n<=26),後面的3行每行有乙個由大寫字母組成的字串,分別代表兩個加數以及和。這3個字串左右兩端都沒有空格,從高位到低位,並且恰好有n位。

輸出格式:

包含一行。在這一行中,應當包含唯一的那組解。解是這樣表示的:輸出n個數字,分別表示a,b,c……所代表的數字,相鄰的兩個數字用乙個空格隔開,不能有多餘的空格。

輸入輸出樣例

輸入樣例#1:

5 abced

bdace

ebbaa

輸出樣例#1:

1 0 3 4 2

說明 對於30%的資料,保證有n

對於50%的資料,保證有n

對於全部的資料,保證有n

一道搜尋題,一開始我的思路是這樣的:

我從末尾開始填數(搜尋),(程式中專門用doit()這個過程來確定填充順序)

在每填乙個數時,都進行判斷當前的情況合不合法,

這種演算法就比盲目的搜尋快到不知**去了,

然而顯然不是正解:

時間比ac大佬們的不知道慢到**去了

然而:70分的**每個字母的值是從0~n-1搜尋的,

看到一位「前輩」說改一下搜尋順序就好了(luogu的資料很迷)

於是n-1~0 就成功90了(而且還快了。。撒花~~~):

這裡寫**片

#include

#include

#include

using

namespace

std;

const

int n=30;

char a[n],b[n],c[n];

int n,ans[n];

bool p[n],flag=1;

int sx[n];

void print()

int pd()

return1;}

void ss(int t)

else

else ans[sx[t]]=-1;}}

}void doit()

}int main()

《待續<<

題解 P1092 蟲食算

聽說正解是高斯消元吶,但是我不會 看到大家都寫了搜尋。一種實現很簡單的方法是列舉1 n的排列,判斷是否可行。我算了算時間複雜度 其實我不會算,就大概估計了一下 發現會超時。由於不會算複雜度,我對於這樣的暴搜能過50表示驚訝 o 如果按照豎式從右至左的順序搜,就可以邊搜邊判斷是否可行了。我寫得很麻煩,...

洛谷P1092 蟲食算

所謂蟲食算,就是原先的算式中有一部分被蟲子啃掉了,需要我們根據剩下的數字來判定被啃掉的字母。來看乙個簡單的例子 其中 號代表被蟲子啃掉的數字。根據算式,我們很容易判斷 第一行的兩個數字分別是5和3,第二行的數字是5。現在,我們對問題做兩個限制 首先,我們只考慮加法的蟲食算。這裡的加法是n進製加法,算...

洛谷P1092 蟲食算

所謂蟲食算,就是原先的算式中有一部分被蟲子啃掉了,需要我們根據剩下的數字來判定被啃掉的字母。來看乙個簡單的例子 其中 號代表被蟲子啃掉的數字。根據算式,我們很容易判斷 第一行的兩個數字分別是5和3,第二行的數字是5。現在,我們對問題做兩個限制 首先,我們只考慮加法的蟲食算。這裡的加法是n進製加法,算...