簡單列舉?你管這叫簡單???

2022-06-09 01:33:11 字數 2847 閱讀 6940

這劉汝佳說的。。。

已經好久沒碰數學的我感覺被針對了。。。

ps:題目確實不難,但是都需要動動小腦袋去優化。

輸入正整數n,按從小到大的順序輸出所有形如abcde/fghij = n的表示式,其中a~j恰好為數字0~9的乙個排列(可以有前導0),2≤n≤79。

樣例輸入:

62樣例輸出:

79546 / 01283 = 62

94736 / 01528 = 62

首先題目中要求a~j是數字0~9的乙個排列,這說明這些數字不能重複出現,0~9恰好都出現且僅出現一次。這是我出錯的地方。

還有,不用列舉所有可能的分子和分母,判斷是否符合規則並且相除等於n,這樣所需要的時間複雜度是\(o(n^2)\),要做大概\(10^8\)次迴圈。簡言之就是利用我們已知的n來減少迴圈次數。

我們可以把等式變形,\(abcde = n \times fghij\),然後我們只需要列舉\(fghij\)就能得到\(abcde\)然後判斷兩個數是否符合規則即可。複雜度降到了線性時間,需要做不到\(10^4\)迴圈。

#include "iostream"

#include "cstdio"

#include "cstring"

using namespace std;

// str是 "abcde / fghij"

char str[14] = ;

// 判斷兩個數是否滿足要求

bool is_vaild() ;

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

}return true;

}// 將整數ab轉換成字串

void to_str(int a, int b)

pos = 12;

while (pos >= 8 && b != 0)

}int main()

if (cnt == 0)

}return 0;

}

輸入n個元素組成的序列s,你需要找出乙個乘積最大的連續子串行。如果這個最大的乘積不是正數,應輸出0(表示無解)。\(1≤n≤18,-10≤si≤10\)。

樣例輸入:

32 4-3

52 5 -1 2 -1

樣例輸出:

case #1: the maximum product is 8.

case #2: the maximum product is 20.

這題沒啥可說的,就是編碼的時候小心點就好了,我他媽wa了七八次。

連續子串行有乙個起始位置,乙個結束位置,遍歷這兩個位置即可。

需要注意的是,序列最長18個,單個元素絕對值最大\(10\),得用long long。

#include "iostream"

#include "cstdio"

using namespace std;

int main()

}printf("case #%d: the maximum product is %lld.\n\n",times,max);

}return 0;

}

輸入正整數k,找到所有的正整數x≥y,使得\(\frac=\frac + \frac\)

樣例輸入:212

樣例輸出:

21/2 = 1/6 + 1/3

1/2 = 1/4 + 1/4

81/12 = 1/156 + 1/13

1/12 = 1/84 + 1/14

1/12 = 1/60 + 1/15

1/12 = 1/48 + 1/16

1/12 = 1/36 + 1/18

1/12 = 1/30 + 1/20

1/12 = 1/28 + 1/21

1/12 = 1/24 + 1/24

根據第一題的思路,我們知道肯定不能遍歷所有的xy,要把等式做些調整,利用上我們已經知道的k來減少迴圈次數。

最後把等式化簡成這樣的形式:\(x=\frac\)

這樣做有幾點好處:

同第一題,利用k減少迴圈次數

減少強轉和小數運算帶來的精度損失(如果很多個分式,會出現精度損失,造成漏掉正確答案的後果)

這樣能縮小y的下界,題目中只說xy是正整數,那麼y就得從1開始迴圈,而這個分式說明了y必須大於k,所以y可以從k+1處開始迴圈。

還有就是y的上界,不能一直迴圈下去,要找到乙個上界來停止y的迴圈。

\[\because x \ge y,\frac=\frac + \frac且k,x,y \in n^+

\\\therefore \frac \le \frac\\

\max(\frac) = \frac+\frac\\

\frac \le \frac\\

y\le 2 k

\]所以y迴圈到\(2k\)即可。

#include "iostream"

#include "cstdio"

#include "vector"

using namespace std;

int main()

printf("%d\n", ans.size());

for (int i = 0; i < ans.size(); i++)

}return 0;

}

你管這叫 PageRank 演算法

一 如果乙個網頁被很多其他網頁鏈結到的話說明這個網頁比較重要,也就是pagerank值會相對較高。二 如果乙個pagerank值很高的網頁鏈結到乙個其他的網頁,那麼被鏈結到的網頁的pagerank值會相應地因此而提高。一 給每個網頁乙個初始pagerank值。二 通過 投票 演算法不斷迭代,直至達到...

簡單的列舉

補一下從前的做題記錄。某天一口氣水了三道簡單的列舉 這三道題的核心思想就是列舉,通過暴力的列舉所有情況來結局題目。總體來說比較不費腦,只需要列舉所有情況就可以了,但是在列舉的 方法上,要注意方法的優化,不然可能會超時的。第一題 uva725 7.1 division 這個題的意思是說輸入正整數n,按...

7 1 簡單列舉

第七章主要講述暴力求解法 許多問題都可以暴力解決 不用動太多腦筋,把所有可能性都列舉出來,然後一一試驗,儘管這樣的方法看起來顯得很 笨 但卻常常是行之有效的 在列舉複雜物件之前,先嘗試著列舉一些相對簡單的內容,如整數,子串等,儘管暴力列舉不用太動腦筋,但對問題進行一定的分析往往會讓演算法更加簡潔,高...