❶ ACM演算法好書
建議先看一些數學基礎課程,線代,高數,C語言變成基礎
到大二再開始看吧,比較難
❷ ACM 演算法超難題目
出題人的表達能力太差,題目敘述得很糟糕,最後兩個例子也錯了
比較好的敘述是,輸入n,輸出從0到32中取6項按字典序排序下的第n個組合(從第0個組合0,1,2,3,4,5開始計)
這種談不上什麼難題,只不過是入門級的問題
在給定前k項的(記第k項為m)情況下餘下的項共有C(32-m,6-k)種情況,這里C(x,y)表示x取y的組合數,以此編程即可
給你一個例子
#include<stdio.h>
intbinom(intn,intm)
{
inti,c=1;
if(2*m>n)
n=n-m;
for(i=1;i<=m;i++)
c=c*(n+1-i)/i;
returnc;
}
intmain()
{
inti,n;
intA[6]={-1};
while(scanf("%d",&n)!=EOF)
{
n++;
if(n<=0||n>binom(33,6))
{
printf("Invalidinput ");
continue;
}
for(i=1;i<=5;i++)
{
for(A[i]=A[i-1]+1;;A[i]++)
{
intt=binom(32-A[i],6-i);
if(n>t)
n-=t;
else
break;
}
printf("%d,",A[i]);
}
printf("%d ",A[i-1]+n);
}
return0;
}
❸ acm計算幾何演算法
計算幾何?這不是很多嘛。我這手裡還有一本黑的書,就是講計算幾何的,不過我現在專業問題不會再研究ACM了……另外網上也有很多東西的。實在不行你就弄本《計算機圖形學》,也有許多的問題啊。
❹ 什麼是ACM演算法設
ACM是美國計算機協會
和演算法有關那就指程序設計競賽
會涉及很多演算法
不知你想問什麼
❺ ACM演算法與數據挖掘,機器學習的演算法有沒有關系,有沒有幫助
沒有直接關系,但是幫助很大。一方面,演算法的很多方面都是相通的,學習基本演算法有助於打開思路。另一方面,現在ML和DM領域對運算能力的要求越來越高,尤其是大數據背景下,你提出的演算法的復雜度、效率等等都有很高的要求,這樣你做過ACM比賽,顯然就比其他人更有優勢,也更能解決實際問題。所以幫助肯定是有的,而且很值得。
❻ 想學acm但是演算法方面真的好差
某位很有哲理的同學和我說,要練好acm,就要多做題,我覺得很有道理。你可以去一些計算機比較好的大學的acm訓練網站上找題目做。學校里acm的訓練,無非也就是做做題,然後講解一下思路。所以除了多做題,你還要學會去看別人好的代碼,吸收一下。再看些演算法的書,裡面有很多演算法的講解。積累什麼的,很重要啊~~~
❼ ACM:參加過ACM的大牛是不是練習時都要把每個演算法敲幾十幾百次呢
ACM比賽可以帶紙質資料,准備一份模板是很有必要的,所以演算法模版很重要,記住模版一定要權威,不要網上雜七雜八的拿來當模版,一份好的模板一定會對你的編程習慣和演算法實現打下良好的基礎。但是,ACM比賽的等級越高,模版的作用就越小,畢竟比賽不是套模板。
沒有人會把每個演算法敲幾百遍,大牛更加不會,敲十遍還記不住的話,一百遍也沒用的,重要的是對演算法本身的理解。如果你真正理解了演算法但寫不出來,那是你編程水平問題,這樣應該多看看大牛的代碼,多看看模板。
大牛不是演算法模板敲的多,而是對演算法理解的深刻並加上做的題目多,演算法就像數學公式,你記住公式難道就能考高分了嗎。重要的是運用啊,一個數學高手對於新學的公式他可以隨時推導出來,因為對公式真正理解啊,推的多了自然記住了,不是嗎。對於新手,先不要學演算法,先去poj做水題,就是簡單的題目沒什麼演算法,水題不要做太多,100題就差不多了。接下來就該系統的學習一下演算法了,《演算法導論》和《演算法藝術與信息學競賽》是我覺得必看的兩本書。另外,歷屆NOI國家隊選手的論文也是很有價值的,也屬於必看。接下來繼續去poj做題,多思考,做不出來就網路,google,poj做題的人非常多。做題可以查漏補缺,之前沒碰到過的 演算法都可能在題目中體現,碰到沒學過的演算法就網路學習,然後選一個好的放到你的演算法模板庫,poj做題1000以上想不成大牛都難!
我只想說大牛基本上都是這么過來的,當然不排除個別天才,不過我沒碰到過也沒聽過誰不做大量的題就能成為牛人的,畢竟天道酬勤。
❽ 一道ACM編程題 求演算法思路.
你需要找環。
每一個長度為n的環要排好, 需要n-1次操作.
如5 3 4 2 1
有兩個環,
5 1
3 4 2
所以需要1+2=3次操作
分別是
1和5換
3和2換
3和4換
❾ 怎樣求大組合數(取模)(ACM演算法)
這種題目然做過的,
意思比較簡單,就由 m 個共 0 和 n 個 1 組成一個串,但從左到右要1出現的次數不少於0出現的次數。
由大牛的演算法: 結果就是 C(m+n, n) - C(m+n, m-1) 再取模,我們可以對式子化簡一下就是:
(n+m)!*
(n-m+1) / ((m)!* (n+1)!)
再取模,但由於組合數很大,直接用大數乘除就會超時了,看了別人的報告才知道原來可以用素數化簡快速求模的, n! = 2^p[i] *
3^p[i] * 5^p[i]*...... 再求模就可以很快了~(^ = ^)~。。。
#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
#define M 2000005
#define mm 20100501
bool sig[M];
int prime[150000], p[150000], len; // prime 記錄素數, p 記錄素數的冪 len 記錄長度
void getprime() // 篩法找素數
{
int i,j,k=0;
prime[k++] = 2;
for(i=3; i<=M; i+=2)
{
if( !sig[i] )
{
prime[k++] = i;
for(j=i; j<=M; j+=i)
sig[j] = 1;
}
}
}
void get(int k, int s) // K! 的素數分解, S為指數的加減(分母,分子)
{
int i, mid;
for(i=0; prime[i]<=k && prime[i]; i++)
{
mid = k;
while(mid)
{
if(s)
p[i] += mid/prime[i];
else
p[i] -= mid/prime[i];
mid /= prime[i];
}
}
if(len < i)
len = i;
}
__int64 cal() // 計算結果 (prime[i...]^p[i...]) % mm
{
__int64 i,ans = 1;
for(i=0; i<=len; i++)
{
if( p[i] )
{
__int64 t = prime[i], b = p[i], ret = 1;
while(b) //計算 (t^b) % mm
{
if(b%2) ret *= t %mm;
t = t*t%mm;
b /= 2;
}
ans = ( ans*ret ) % mm;
}
}
return ans;
}
int main()
{
int t,m,n,i,mid;
__int64 ans;
getprime();
cin>>t;
while(t--)
{
cin>>n>>m;
len = 0;
memset(p, 0, sizeof(p));
mid = n-m+1; //先前要把 n-m+1 的因子加進 P 中去才能使 (m+n)! / ((m)!*(n+1)!) 整除
for(i=0; mid>1; i++)
{
if( mid%prime[i] == 0)
{
while(mid%prime[i]==0)
{
p[i] += 1;
mid /= prime[i];
}
}
}
get(m+n, 1);
get(m, 0);
get(n+1, 0);
ans = cal();
printf("%I64d\n", ans);
}
return 0;
}
可以用素數分解法,
先求出上面和下面的素數表示,然後約分後,再用求冪公式
❿ 程序演算法acm,跪求
這個比較麻煩,加我好友詳談吧