以題著手,先上題。
題意大致為,n堆果子,每一次合併兩堆果子為一堆,消耗的體力等於兩堆果子的重量之和。直到經過 n-1 次合併之後, 就只剩下一堆了,要求消耗體力最少。
例如有 3堆果子,數目依次為 1,2,9。可以先將 1、2堆合併,新堆數目為3,耗費體力為3 。接著,將新堆與原先的第三堆合併,又得到新的堆,數目為12,耗費體力為 12。所以多多總共耗費體力 =3+12=15=3+12=15。15 為最小的體力耗費值。
說實話,不覺得這是貪心問題,在我的印象中貪心。。。啥?
一看到題直接想到的就是排序,最小的兩個數相加後再排序,時間花銷得t (n^3),然後看看資料10^4,好像不能這麼幹。演算法複雜度評估參考這裡。
再仔細想了下,我只要保每次證最小的兩個數在前面,然後這兩個數相加之和替換前兩個數(刪除乙個覆蓋乙個),迴圈找最小的兩個數直到只剩2個數,這樣時間複雜度變為t (n^2),空間o(n),能ac了。
#include//萬能頭
using namespace std;
#define maxx 10010
int a[maxx];
void swapmin(int x,int n)//找最小的數放最前面
for(i=1;i到這裡遇到乙個問題,就是c++過載到底是什麼鬼,完全忘了。
看了譚浩強c++書上的介紹,大致有了個了解(不懂的地方更多了..)
簡單的理解有過載函式和過載操作符兩種。
過載函式就是不同函式用同乙個名字,呼叫的時候根據引數和型別選擇自動呼叫哪乙個,能實現的原因是編譯的時候其實編譯器還是會給每個函式不同的名字以區分。
過載操作符就是重新定義操作符(+-*/% > < !=.....),比如需要讓自己定義的結構體能實現+操作,就需要過載+操作符了。形式和函式定義基本一樣。如 int operator + (int a,int b) ,只不過名字的寫法固定。
剛看到混合牛奶這個題還以為是動態規劃,仔細想了一下,也就是簡單排序。
刷了7個貪心題,第8個國王遊戲怎麼都過不了,好像是個大數問題,明天單獨研究一下。
大數(又叫高精度)的基本操作包括加、減、乘、除和取餘。
加法實現原理就是讓每個對應位相加,先不進製,全部加完後從最低位開始依次進製。
乘法的思想就是迴圈的實現加法,只不過每一次要保證加的位置正確,最後處理進製問題。
減法和加法的原理一樣,只不過一般先判斷一下大小,用大數減小數,一般同時處理進製,其實之後統一處理也一樣。
除法說白了就是迴圈的減,減到小於除數為止,剩下來的就是餘數。優化一點就是每次放大被除數的倍數,減少迴圈次數。
所有的負數都可以變成正數處理,判斷一下符號就行了。
當然,這些都是模擬正常的手算過程,其實都有先進的演算法(fft),沒興趣取了解,像python自帶大數問題。手寫了乘法,現在感覺完全沒必要,純粹當提公升一下編碼能力。
#include#include#includeint multibiginteger(char *num1,char *num2,int *res)
for(i=0;i<=len;i++)
printf("%d ",res[i]);
printf("\n");
for(i=0;i<=len;i++)
// return res;
}int main(void)
, num2[100] = ;
while(scanf("%s%s", num1, num2) != eof)
return 0;
}
回到國王遊戲這個題。
一開始看到這個題的思路就是按左手排序,左手相等時右手小的排前面。然後一輪迴圈找出金幣數最多的大臣。
too young too young....20分。
看了解答才知道,要用左手右手乘積排序!推導也很簡單,就是把基本求金幣公式寫出來,然後如果前乙個比後乙個小,推出必須為左右手乘積比後乙個小。 其他思路一樣。高精度也就是在找金幣最多大臣的時候一直連乘,大數乘小數和大數除小數的問題。
思路簡單,寫起來有點麻煩。
#includeusing namespace std;
#define maxx 10010
int mul[maxx]=;//類成
int maxx[maxx]=;//最大金幣
int ans[maxx];//當前大臣的金幣
int lena=1,lencoin,lenmaxx=0;
struct node x[maxx];
bool cmp(const node &x, const node &y)
void mulit(int a);
void div(int b);
void cmpare();
int main()
sort(x+1,x+n+1,cmp);//國王不參與排序
//long long mul = x[0].a;
//long long m = 0;
for(i=1;i<=n;i++)
for(i=lenmaxx;i>=0;i--)
cout<=0;i--)
lencoin = lena-1;
while(ans[lencoin]==0&&lencoin)//找到除數第乙個位置
lencoin--;
}void cmpare()
{ int i;
if(lenmaxx=0;i--)
if(maxx[i]發現了一些規律。最典型的貪心套路就是陣列+排序。要麼直接按某個變數排序,要麼按價效比排序(類似**/數量)等等。總之說白了基本上是一維問題。0-1揹包這種一維解不了了就用動規變成2、3維問題。
現在感覺嘛,貪心就是一種思想,不是特定的演算法。像哈夫曼樹、最短路徑這種題都是貪心。
貪心就先了解這麼多,等提高的時候再練吧。
初遇設計模式
今天開始學設計模式了。用的是程杰老師寫的 大話設計模式 在網上搜了一下這位老師的資料,簡單的了解一下這位大牛。那麼什麼是設計模式?design pattern 設計模式 design pattern 是一套被反覆使用 多數人知曉的 經過分類編目的 設計經驗的總結。使用設計模式是為了可重用 讓 更容易...
初遇C語言
壹 知識總結 第二章 c資料型別 1 int定義整數量 float定義單精度浮點數量 double定義雙精度浮點數量 char定義字元型量。2 讀程式都要從main 入口,然後從最上面順序往下讀 碰到迴圈做迴圈,碰到選擇做選擇 有且只有乙個main函式。3 注釋不可以巢狀,如int a 1,int ...
初遇建構函式
在翻劉汝佳的紫書的時候看見一種奇怪的結構體寫法 struct edge 這裡有兩個奇怪的東西 1.edge int u,int v,int d 結構體裡面套了乙個什麼玩意?2.from u to v dist d 這是什麼打法?問了下餘翱,第乙個是建構函式,可以在main裡面呼叫從而快速賦值。例如....