math解題報告

2021-08-07 12:19:30 字數 1240 閱讀 9351

在sak同學的熱心幫助下,終於成功的搞清了0.0

手動@sak

[建議先看程式後看我的文字。。]

由於維數包括 當前位數、原數每位之和、原數*d每位之和、 *d後的進製, 維數太多了存不下,又要判斷是否計算過這樣由四維組成的狀態,只好用起了位運算。

f[i][j][k]表示 運算到第i位 s1剩j s2剩k下=時 的乙個二進位制數(二進位制是為了判重用。)

place存放的是乙個可以改變f[i][j][k]某一位上的數字(0變1,1還是1,巧妙地運用「|」[按位或])的二進位制。將f[i][j][k] |= place[l]即可改變。

判斷是否找過這四維組成的狀態可以:

if(f[i][j][k] & place[l] == 1)說明是計算過的,這個想想就清楚啦!

整個過程就是最高位找起(最高位比較特殊不能為0嘛,在主程式搜,dfs內部就是找剩餘位上的)dfs的第四維也就是每個for(int j = 0; j < 9; j++)是列舉*d後的進製j/more,至於為什麼進製只有0~8也是因為最大9×9只有81嘛,只能進8啦。。

這個程式設計不得不說真心巧妙和高階,佩服的五體投地。

考試有這樣清晰的思維很羨慕。

以下是**(噓!)

#include

#include

#include

#include

#include

using namespace std;

const int maxn=1e2+5,maxs=10

*maxn;

const short place=;

int n,s1,s2,d;

intx[maxn];

short f[maxn][maxs][maxs];

int dfn_clock;

int flag;

void dfs(int

pos,int rest1,int rest2,int more)

for(int i=n;i;--i) printf("%d",x[i]);

puts("");

flag=1;return;

}for(int i=0;i<10;++i)

f[pos][rest1][rest2]|=place[more];

}int main()

if(!flag) puts("cirno is too smart");

return

0;}

Block Voting 解題報告

這道題做的有點狼狽,效率不高,差一點就tle的ac了。看status裡的,ac的時間大多數都是0ms的。肯定有乙個更有效率的演算法的。下面說下我的狼狽演算法。出處 http acm.jlu.edu.cn joj showproblem.php?pid 1223 問題描述 求每個party的權值。第i...

Safebreaker 解題報告

又是吉林大學一道acm題目,題目很簡單,直接暴力解決。出處 http acm.jlu.edu.cn joj showproblem.php?pid 1718 問題描述 對乙個給定數0000 9999 根據一系列猜測,判斷這個數是否存在,存在的話,是否唯一 例如 3321,給定數 作出猜測,1223 ...

路由 解題報告

路由 問題描述 有乙個tcp ip網路 每台計算機都有乙個或多個網路介面。每個介面根據它的ip位址和子網掩碼來識別 即兩個4位元組的數,兩個字 節之間有乙個 號.子網掩碼有乙個二進位制表示法 有k個 1 然 後是 m 個 0 k m 8 4 32 如 212.220.35.77 是乙個 ip 地 址...