Time of Update: 2018-12-03
Polya定理: 設G是一個p個對象的置換群,那麼用k種顏色對p個對象進行染色!當一種方案在群G的作用下變為另外一種方案,那麼我們這個時候就認為這兩個方案是一樣的。那麼在這種規定下不同的染色方案為:n=(Ek^m(f))/|G|,其中m(f)是置換f的迴圈節。 Polya定理是基於Burnside定理和另外一個定理的,其中Burnside定理的通俗表達方法如下:
Time of Update: 2018-12-03
我們把忍耐度作為背包容量,把經驗值作為價值,增加一維數量的限制,那麼這道題就是典型的背包問題。我們定義dp[j][k]表示背包容量為j,選擇k件物品所能達到的最大的價值。其實這是前面省略了一維的結果,我們可以更清晰的定義dp[i][j][k]表示前i中物品中,背包容量為j的背包選擇k件物品所能達到的最大值,我們列開狀態轉移方程之後,發現可以省略前面一維保持答案的正確性,因此我們採用第一種定義來最佳化空間。狀態轉移比較簡單,看看代碼就知道了。#include
Time of Update: 2018-12-03
對於n個給定的不同的數,我們可以將任意一個排列看成是一個置換。於是對於POJ 3270這道題,我們這樣看:首先給你的一個n個任意不同的數形成一個排列,然後我們對這個排列中的數從小到達排序。題目中要求的就是要形成升序的排列。那麼我們把輸入的那個排列看成是一個置換。
Time of Update: 2018-12-03
POJ 1655 Balancing Act 簡單樹狀DPhttp://poj.org/problem?id=1655這道題目題意是說,任意刪除樹中的一個點,那麼被分成幾棵樹之後,子樹中點數最大的值就是該點的balance,求具有最小Balance的點。我們用num[i]表示以i為根節點的子樹所包含的點的個數,那麼該點的balance就是最大那個num[i]值了,比較簡單,要是不會就看看代碼吧,這道題很簡單!#include <iostream>#include
Time of Update: 2018-12-03
一看這道題,感覺有點像今年多校的一道題,但是一看資料n的大小達到了10^4,那麼如果建圖跑的話要T,因為建圖的複雜度差不多N^2的,於是不能用多校的那道題的做法。 我們看看給的l和r的資料範圍比較小,1到100,那麼我們使用一個dp資料記錄dp[i][j]表示(i,j)出現的次數,然後我們按照題目要求的規則便是需要i>=i'&&j>=j',於是我們定義狀態dp[i][j]表示i'<=i&&j'<=j的最大的累加和,
Time of Update: 2018-12-03
還是王富濤啊,留言問了一個和 “類的引用成員資料” 有關的問題。什麼叫“類的引用成員”,看看:Code:class Coo { int& ref; //ref 是一個引用 }; “引用”是什嗎? 實現上,引用記的是另一個變數的地址,引用自己並沒有“真身”。這一點和指標很像了,除了使用文法不同外,重要不同是,C++規定不能有“Null 參考”(java語言存在Null
Time of Update: 2018-12-03
通常來說,母函數的思想就是使用冪級數來表示一個離散數列。例如對於一個數列是a={a0,a1,a2,-------ak},那麼我們可以母函數的定義就是G(x)=a0+a1*x+a2*x^2+a3*x^3------an*x^n,這裡的G(x)就是數列a的母函數。 母函數可以用來解決整數拆分問題,下面舉一個例子來說明。 例如我們有重量為1克、2克、3克、4克的砝碼各一個,那麼問你這些砝碼可以稱出幾中重量?每一種重量有多少種方案數?
Time of Update: 2018-12-03
下面的題目都是更新點尋找區間或者是更新區間尋找點的題目,這一類屬於比較簡單的線段樹的題目,可以用來入門或者加強對線段樹的理解。後面幾道稍微有點難想到,但是想到怎麼使用線段樹之後就是簡單的是用線段樹了。HDU 1754http://acm.hdu.edu.cn/showproblem.php?pid=1754簡單的更新點的值,尋找區間的最大值,很好寫。HDU
Time of Update: 2018-12-03
將一個中序運算式轉化成為逆波蘭運算式的方法其實很簡單,也是一個成型的演算法。通過逆波蘭運算式求一個計算式子的值,也是很簡單的,只要遇到過會用就行了。1、將一個中序運算式轉化成為逆波蘭運算式。 首先維護的是兩個棧,我們這裡暫且稱為S1和S2,S1中的結果最後存的就是逆波蘭運算式,S2中將用於暫時存放運算子並且在最終形成逆波蘭運算式的時候,該棧是會清空的。下面我們看看怎樣具體的形成逆波蘭運算式。
Time of Update: 2018-12-03
HDU 1689http://acm.hdu.edu.cn/showproblem.php?pid=1698這道題是使用懶操作的入門級的題目,線上段樹的結構體中,加一個flag標記該區間是否是同色的。當為同色,那麼在更新或者查詢的時候就可以偷懶了,有效降低時間複雜度。//hdu 1698#include <iostream>#include <cstring>#include <cstdlib>#include <cstdio>#define
Time of Update: 2018-12-03
題意: 這道題的題意是說給你n個數順時針圍成一個圈,用最少的相鄰交換的次數,將其轉變成為逆時針的一個圈。我們從較小的例子進行考慮,當n為偶數的時候,我們將前n/2 = m個數順序全反最少的交換次數為m*(m-1)/2,那麼將n個數最小的交換次數便是m*(m-1)。而對於n為奇數的時候,我們首先將最大一個數轉移到對應的逆時針的圈的交換次數為n/2,剩餘的(n-1)個數同偶數的情況是相同的。這個題比較簡單,自己比劃一下就能想通……Java代碼:import
Time of Update: 2018-12-03
HDU 1540 Tunnel Warfare這道題中我們用0表示該點是好的,1表示已經被毀壞。那麼這道題就是更新點尋找區間的線段樹,但是為了能夠求某個點連續的0的個數,我們線上段樹內需要記一個區間左右端點連續的0的個數。這樣當查詢的時候,分成兩邊來查詢,然後判斷一下點本身是否為被毀壞就行了。詳細見代碼:#include <iostream>#include <cstring>#include <cstdlib>#include <cstdio>#
Time of Update: 2018-12-03
這道題就是整數的劃分,其實定義好了狀態,就是簡單的動態規劃的遞推。我們定義dp[n][k]表示將n進行劃分,最大的數不超過k的方案有多少種,那麼我們可以得到如下的遞推方案:dp[n][k] = dp[n][k-1] +
Time of Update: 2018-12-03
[回到目錄]白話C++3.14.Hello STL 演算法篇 前一小節,在輸出成績時,我們從students中得到每個學生的學號,然後,通過for迴圈,在一個list中尋找符合“學號等於指定值”的元素。代碼如下(為了方便說明,行號進行了重排):001 for (list<Score>::const_iterator iter = scores.begin(); iter != scores.end(); ++iter)
Time of Update: 2018-12-03
給你一個n*m的矩陣,讓你輸出如下的數字矩陣:01 06 0502 03 04如下:就是這樣,然後自己就寫了一發:代碼貼出來供參考:#include <stdio.h>#define MAX 1000using namespace std;int maze[MAX][MAX];int Update(int n,int m,int &sx,int &sy,int cnt,int sum){ if(n==1&&m==1) {
Time of Update: 2018-12-03
下面的面試題都是我在網上或者論壇上看到,結合自己的解法,給大家分型。但是也有可能有的題目還沒有看到正確解法的面試題或者筆試題,如果哪位牛人看到這些題,並且有想法或者會的話,麻煩留言,給大家分享,多謝!1、已知一個數組,求第一個只出現一次的那個數。要求時間複雜度為O(n),空間複雜度為O(1)。解答:http://blog.csdn.net/geniusluzh/article/details/83097962、求一個序列的最大和第二大的值。解答:
Time of Update: 2018-12-03
這道題是09年上海地區賽的A題,雖然很水,但是不能直接爆搜,直接爆搜要T。於是我們看到題目的要求是說當操作的步數大於3的時候就輸出more,那麼我們可以從終態枚舉進行了三次操作所能達到的所有狀態,這個是用廣搜應該還是很好寫的。我們直接使用vis數組就完全可以勝任這個記錄了,沒有必要用任何的結構體。
Time of Update: 2018-12-03
這道題好傷心啊,我wa了好久,原因是我理解錯了題意。 下面還是先說說題目的解題思路吧:1、當兩條線段不想交的時候結果是0.00,這裡就排除了平行的情況;2、當兩條線段有任一條平行於x軸的時候,結果同樣為0.00;3、當兩條線段相交但是是共線的時候(用平行來判斷),結果同樣為0.00;4、還有一種情況就是說,如果存在,某一個在上面的木板擋住了下面的木板的時候,那麼同樣結果為0.00;
Time of Update: 2018-12-03
這道題應該說是線段樹和樹狀數組簡單的應用吧!都是用到了基本的功能更新區間尋找點!當使用線段樹時,不想原來更新點尋找區間那麼簡單,這裡需要在結構體內另外添加一個lnc用來記錄更新區間時正好覆蓋到該地區時的改變值!然而在尋找區間過程中當所尋找的區間並不是給定的區間時,需要把給定的區間的sum值進行更新改變!並且也把該子區間的調用update進行更新,這樣才能維護一個更新區間尋找區間的線段樹!用樹狀數組時需要注意此時read(i)就是讀取下表為i的值為read(i)!注意數組盡量開大點!避免出現wa或
Time of Update: 2018-12-03
主流的幾個像POJ、ZOJ、HDUOJ、HOJ(哈工大)、HUST(華中科大)的幾個就不介紹了!下面介紹幾個很不錯但是很少人知道的OJ!希望對讀者有些許協助!以下的介紹順序不是按任何順序排列的,為看到想到才寫的!若有不妥之處,請讀者見諒!! Vijos(Velocious Informatics Judge Online System)地址:http://www.vijos.cn/介紹: Vijos是Vivian