詳細**可以fork下github上leetcode專案,不定期更新。練習題如下:
非常easy,素數就是從最小數開始生成的,它的倍數都不是素數,應該說這是素數最本源的定義了。
**如下:(艾氏篩法)
public
static
void
main(string args) throws numberformatexception, ioexception
}prime[i] = k;
}bufferedreader br=new bufferedreader(new inputstreamreader(system.in));
string str;
while ((str=br.readline())!=null)
}
思路:艾氏篩選+bfs,起初做法是暴力bfs,不管三七二十一,把所有符合條件的素數加入佇列中,結果執行即慢,在oj上還mle了,後來才發現bfs也可以剪枝。剪枝的方法:用dp記錄到達當前素數的路徑長度,如果先前已經抵到過了,則不再需要加入佇列。
**如下:
/**
* bfs + seive
*@param args
*@throws ioexception
*/public
static
void
main(string args) throws ioexception
}static
int max = 9999 + 16;
static
boolean isprime;
public
static
void
seive()}}
}public
static
intsolve(int from, int to)}}
return dp[to];
}public
static
intnext(int prime, int digit, int change)
return
0; }
唉,也不知道是在考閱讀理解,還是真的學演算法,理解了半天都不知道它到底說的啥意思,題目真的太含糊。實際上是求:乙個數的質因子個數,及這些質因子組成數列的排列組合,順序無所謂,但要考慮重複質因子。
公式: 排列
數=n!
∏ki=
1ni!
其中,n表示所有質因數的個數,ni
表示,每個質因子的出現的個數。
如:
100: ,
並沒有使用pollardrho演算法,暴力做法也有o(
n√) ,num在220
範圍內,此題夠了。
**如下:
public
static
void
main(string args) throws ioexception
in.close();
}public
static string solve(int num)
long cnt = 1;
for (int key : factors.keyset())
cnt = factor(max) / cnt;
return max + " " + cnt;
}public
static
long
factor(long n)
return res;
}public
static mapprimefactor(int num)
}if (num != 1)
return factors;
}
思路:艾氏篩選,接著合成hsemiprime,這道題剛開始以為求出所有的hprime之後,直接合成不會存在重複元素,所以用二分或者帶方向的遍歷就完事,可惜它居然存在重複元素!
**如下:
public
static
intsolve(int h)
return cnt;
}
測試用例過不了(合成中存在重複元素,所以只能記錄所有可能的hsemiprime),這樣的話,就在程式初始化時就全部算出來即可,再用accumalte,進行統計,簡單。
**如下:
public
static
void
main(string args)
in.close();
}static
int max = 1000001 + 16;
static
boolean hprime;
static
long prime;
static
boolean hsemiprime;
static
int accumalte;
public
static
void
seive()
int k = 0;
for (int i = 5; i < max; ++i)}}
hsemiprime = new
boolean[max+1];
for (int i = 0; i < k; ++i)
}accumalte = new
int[max+1];
for (int i = 1; i < accumalte.length; ++i)
}
挑戰程式競賽系列(17) 3 1最大化平均值
詳細 可以fork下github上leetcode專案,不定期更新。練習題如下 01分數規劃,具體可以參考博文寫的非常詳細且通俗易懂。我的認識 中學裡學過二分法求函式零點,其實該 模擬的就是這種求解過程,所以只要寫出目標函式,零點不難求。接著就得到了求和式 i 1n ai l bi 0要刪除k個物品...
挑戰程式設計競賽(3)
給定整數a1,a2,an,判斷是否可以從中選出若干數,使他們的和恰好為k。1 n 20 1e8 ai 1e8 1e8 k 1e8 樣例1input 4 1 2 4 7 13 output yes 13 2 4 7 樣例2input 4 1 2 4 7 15 output no dfs include...
挑戰程式設計競賽 樹
二叉樹的表達 樹的遍歷 從根r到結點x的路徑長度為x的深度 depth 結點x到葉結點的最大路徑長度成為結點x的高。請編寫乙個程式,輸出給定有根樹t中各節點u的資訊。採用 左子右兄弟表示法 1 結點u的父節點 2 結點u最左側的子結點 3 結點u右側緊鄰的兄弟結點 引用u.parent即可知道結點u...