GCJ 2016 QR解題報告

2021-07-11 02:44:07 字數 2587 閱讀 8155

a.  

題目大意是,給你乙個初始的整數,然後用他*1, * 2,*3 ....,並把所有出現過的數字記錄下來, 問什麼時候0~9所有數字都出現了一遍。

剛開始還懷疑有沒有可能死迴圈, 後來沒想直接跑了乙個1~100000的看了下,都有結果,就直接暴力上了。

#include #include #include #include #include #include #include #define inf 1000000007

using namespace std;

long long gao(int x)

int flag = 1;

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

}if(flag) return (long long)cnt * (long long)x;

cnt++;

}}int main()

long long ans = gao(n);

printf("case #%d: %lld\n", ++cas, ans);

}return 0;

}

b. 給出乙個棧序列,是由若干'+'和'-' 組成的。每次允許的操作是從棧頂取出若干元素,整體倒過來放進棧中,倒過來後'+'將變成'-',反之亦然。

問用最少的操作使得整個序列都是'+'

這次完全沒想別的直接上dp了,而正解好像只需要統計有多少段就行了。

dp[i][2]有兩個狀態,分別表示從0到i,整個變成'-'需要的運算元和變成'+'的操作

#include #include #include #include using namespace std;

char s[111];

int dp[111][2];

int main() else

}printf("case #%d: %d\n", ++cas, dp[len][1]);

}return 0;

}

c. 構造題。

給乙個長度n,乙個數量j 

問你是否能夠找到j個長度為n的二進位制數,使得他在二進位制,三進製....九進製,十進位制時都不是素數,並輸出相應的乙個因子

我的做法是直接構造,指定每個進製的因子分別為3,2,5,2,7,2,9,2,11 這樣。或者3,2,3,2,7,2,3,2,3這樣

然後開始構造二進位制串,每個串中最多四重迴圈列舉位置,計算餘數。 就可以了。

**非常醜陋。就不貼了。

但是這個題顯然有更直接的做法。來自昂神。

構造乙個諸如1????11????1 這樣的串,其中?隨意填寫0或者1

那麼因子就是1????1  並且對任意進製都符合。 這解法又直接又簡潔。

d. 這題題意大意就是給了乙個分形。

原始串中包含l或者g,長度為k, 迭代時,串中l會變成原始串,g會變成k個g。

迭代c次,長度就是k^c 

現在給你經過若干次迭代後的串, 問你是否能最多檢視s處元素的情況下判別出原始串是否有g。

那麼對於小資料, 比較簡單了。因為s= k。

我們首先對原始串的任意乙個位置,  假設該處為g ,那麼在最終串中必然會生成乙個長度為k^(c-1)的區間,裡面都是g。

對於每個區間任選乙個位置檢查即可, 總共檢查k次。

那麼對於s < k怎麼辦

還是一樣的方法,對於原始串的某個位置i,假設該處為g,那麼在最終串中最壞情況下,也會生成若干個g,這些g分布在若干個長度不一的區間內。

例如k=5, c=3時

我們看每個位置生成g的情況。 由於串太長了。 我們先看最終串前25個

i=1,ggggggggggggggggggggggggg

i=2,?g???ggggg?g????g????g???

i=3,??g????g??ggggg??g????g??

i=4,???g????g????g?ggggg???g?

i=5,????g????g????g????gggggg

觀察這些我們發現,最多連續三個串,會在某乙個位置都是g

例如i = 1,2,3時,第8個位置都是g,那麼我們檢查這個位置就同時檢查了3個位置。

而最多多少個串可以被同時檢查,可以發現取決於c,也就是同時c個串必然可以同時被檢查。

那麼最終最少的檢查次數就是 ceil(k * 1.0 / c)了

每個位置畫一畫就發現, 需要檢查的位置也很容易算出來了。

#include #include #include #include #include #include using namespace std;

int main()

int num = (int)(ceil(k * 1.0 / c));

printf("case #%d:", ++cas);

if(num > s)

for(int i = 1; i <= num; i++)

//long long mid = ed - base + 1 + 1;

printf(" %lld", st + 1);

}printf("\n");

}return 0;

}

ZJOI2016 解題報告

我大浙的省選題真是超級神仙 這套已經算是比較可做的了。神仙分治題。對於乙個矩形,每次我們從最長邊切開,最短邊不會超過 sqrt 所以對於每個點跑一遍最短路就行了。時間複雜度 o n sqrt log n q sqrt code below include define id i,j i 1 m j ...

ZJOI2016 線段樹 解題報告

很久以前看過題面然後沒有仔細想,再做的時候忘了序列是隨機的了。然後怎麼搞都是o n4 的。我們可以將狀態設為f x,i,l,r 表示在i次操作後,l,r x,l 1和r 1大於等於x的方案數。不妨認為a 0 a n 1 這樣的話假如說有跨越區間端點的操作,那麼就一定會使操作中的數 x。然後令g x,...

NOIP 2016 Day2 解題報告

by 毒液哥 注意到n,m 2000.而我們的問題是對範圍內所有組合數統計能被k整除的個數,所以我們需要得到範圍內所有的組合數模k的餘數。要注意j i,不要計算多餘的0.用楊輝三角形遞推求出組合數,再用字首和處理即可。每次用線性時間找到最大值。切成兩條。把其他所有的加上q.記得輸出。35分演算法中有...