導航:首頁 > 源碼編譯 > 貪心演算法一文搞懂

貪心演算法一文搞懂

發布時間:2023-10-12 08:35:14

A. 求解一道貪心演算法

因為這個問題涉及到高維求解(大於3維),所以不推薦你用貪心演算法或遺傳演算法之類的演算法。這里給出一種升級的蒙特卡羅演算法——自適應序貫數論演算法,這是一種以GLP集合為基礎的隨機遍歷演算法,可以很輕易的解決一系列的高維求解問題,目前根據網上能找到的資料最多可以做到18維。

下面就根據你給出的例子講解一下:

對於6000的料來說

1185最多做到5根(要求4根,所以一根木料對於1185的產品來說最多有0到45種可能);1079最多做到5根;985最多做到6根;756最多做到7根。

所以第一次加工一根木料最多有5*6*7*8=1680種加工可能(當然其中包括那些產品總長度大於料長的可能,但是我們可以通過罰函數來避免這些情況),那麼利用GLP演算法我們可以一次性產生這1680種可能,然後逐個比較那種可能最省木料;

設第一加工出的產品量分別為1 1 3 1

那麼1185加工量剩3,1079剩5,985剩7,756剩7,所以第二次加工的可能性有(3+1)*(5+1)*(6+1)*(7+1)=1120種

關於自適應序貫數論演算法,根據這道題你可以這樣理解,4種尺寸構成了一個4維的空間,四種尺寸的每一種組合相當於空間中的一個點(1185的1根,1079的1根,985的3根,756的1根,這就組成了這個4維空間中的(1,1,3,1)點) ,自適應序貫數論演算法就是先根據GLP演算法在這個4維空間中隨機的,均勻的分布一定的點(也就是尺寸的組合),然後根據目標函數確定其中哪一個點是最優點,我們認為最優點的附近出現最優解的可能性最大,那麼我們就以最優點為中心,以一定的尺度為半徑將原空間縮小,然後我們在心空間中再一次利用GLP演算法均勻,隨機的充滿這個空間,然後重復以上過程,直到這個空間小到我們事先規定的大小,這樣我們就找到了最優解。

也許你會擔心演算法一上來就收斂到了局部最優解,然後一直在這里打轉,不用擔心,GLP最大的優點就是均勻的充斥整個空間,盡量將每一種可能都遍歷到。

這種演算法的缺點在於充斥空間用的點需要生成向量來生成,每一種充斥方式都需要不同的向量,你可以在《數論方法在統計中的應用》這本書中查到已有的每種充斥方式對應的那些生成向量。

下面是我跟據對你給出的例子的理解算出的結果。

1185:1根
1079:1根
985:3根
756:1根
剩餘木料0

1185:1根
1079:1根
985:3根
756:1根
剩餘木料0

1185:1根
1079:1根
985:3根
756:1根
剩餘木料0

1185:1根
1079:0根
985:1根
756:5根
剩餘木料15

1185:0根
1079:3根
985:0根
756:0根
剩餘木料2748

用去木料:5根
請按任意鍵繼續. . .

程序代碼如下:(變數都是用漢語拼音標的)

#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <iostream.h>
#include <iomanip.h>
#include <time.h>
#include <fstream.h>
#include <windows.h>
#include "glp.h"
#define jiedeweishu 4
#define glpgeshu 10007
#define glpgeshu1 5003//100063
#define glpgeshu2 6007//33139//71053//172155//100063
#define yuanmuchang 6000
#define qiegesushi 5
#define chicun1 1185
#define chicun2 1079
#define chicun3 985
#define chicun4 756
#define chicun1shuliang 4
#define chicun2shuliang 6
#define chicun3shuliang 10
#define chicun4shuliang 8

float xuqiuchicun[jiedeweishu]={chicun1,chicun2,chicun3,chicun4};
float chicunxuqiuliang[jiedeweishu]={chicun1shuliang,chicun2shuliang,chicun3shuliang,chicun4shuliang};
float zuobianjie0[jiedeweishu];//{-19,1,-11,1.5,0,200};//{0.39111,-18.5,1,-11,1,0,2};//左邊界
float youbianjie0[jiedeweishu];//{-17,1.5,-7,2,0.05,900};//{0.393,-17,2,-9,2,0.1,6};//右邊界
float zuobianjie[jiedeweishu];
float youbianjie[jiedeweishu];
float zuobianjie1[jiedeweishu];//過度用
float youbianjie1[jiedeweishu];
float zuobianjie2[jiedeweishu];//局部邊界
float youbianjie2[jiedeweishu];
float zuobianjie3[jiedeweishu];//大邊界
float youbianjie3[jiedeweishu];
float sheng_cheng_xiang_liang[jiedeweishu]={1,1206,3421,2842};//生成向量
float sheng_cheng_xiang_liang1[jiedeweishu]={1,792,1889,191};//{1,39040,62047,89839,6347,30892,64404};//生成向量
float sheng_cheng_xiang_liang2[jiedeweishu]={1,1351,5080,3086};//{1,18236,1831,19143,5522,22910};//{1,18010,3155,50203,6065,13328};//{1,167459,153499,130657,99554,61040,18165};

struct chushi
{
float geti[jiedeweishu];
float shiying;
};

chushi *zuiyougeti;//精英保存策略
chushi *zuiyougetijicunqi;

int sishewuru(float);
float cha;//左右邊界的差
int biao;//判斷尋優是否成功1表示成功0表示不成功
int maxgen;//最大計算代數
int gen;//目前代數
void initialize();//演算法初始化
void jingyingbaoliu();//精英保存的實現
void mubiaohanshu1(chushi &bianliang);//適應度的計算使用殘差法
int cmpshiyingjiang(const void *p1,const void *p2)
{
float i=((chushi *)p1)->shiying;
float j=((chushi *)p2)->shiying;
return i<j ? 1:(i==j ? 0:-1);//現在是按降序牌排列,將1和-1互換後就是按升序排列
}

int cmp1(const void *p1,const void *p2)
{
float i= *(float*)p1;
float j= *(float*)p2;
return i<j ? 1:(i==j ? 0:-1);//現在是按降序牌排列,將1和-1互換後就是按升序排列
}
void main()
{
float bianjiebianhuashuzu[jiedeweishu];
float yiwanchengshuliang[jiedeweishu];
zuiyougeti=new chushi;//最優個體的生成
zuiyougetijicunqi=new chushi;

int i;

for(i=0;i<jiedeweishu;i++)
{
zuiyougeti->geti[i]=0;
yiwanchengshuliang[i]=0;
}
int muliaoshuliang=0;
while(1)
{

if(yiwanchengshuliang[0]==chicun1shuliang&&yiwanchengshuliang[1]==chicun2shuliang&&yiwanchengshuliang[2]==chicun3shuliang&&yiwanchengshuliang[3]==chicun4shuliang)
break;//都加工完了就退出程序
biao=1;

for(i=0;i<jiedeweishu;i++)
{
bianjiebianhuashuzu[i]=chicunxuqiuliang[i]-yiwanchengshuliang[i];
}
for(i=0;i<jiedeweishu;i++)
{
zuobianjie0[i]=0;
if(bianjiebianhuashuzu[i]>(int)(yuanmuchang/xuqiuchicun[i]))
{
youbianjie0[i]=(int)(yuanmuchang/xuqiuchicun[i]);
}
else
{
youbianjie0[i]=bianjiebianhuashuzu[i];
}
}
for(i=0;i<jiedeweishu;i++)
{
zuobianjie[i]=zuobianjie0[i];
youbianjie[i]=youbianjie0[i];
}
for(i=0;i<jiedeweishu;i++)//在這套程序中邊界分為兩個部分,其中一組是根據最優解的收斂范圍進行局部尋優,如果在局部找不到最優解則以現有最優解為中心進行全局搜索
{
zuobianjie2[i]=zuobianjie[i];
youbianjie2[i]=youbianjie[i];
zuobianjie3[i]=zuobianjie[i];
youbianjie3[i]=youbianjie[i];
}
zuiyougeti->shiying=-3000;
//cout<< zuiyougeti->shiying<<endl;
initialize();
//for(i=0;i<jiedeweishu;i++)/////
//{////
// cout<<zuiyougeti->geti[i]<<",";////
//}/////////
//cout<<endl;/////
// cout<<"初始最優解:"<<" "<<-zuiyougeti->shiying<<endl;/////////////
for(gen=1;gen<maxgen;gen++)
{
jingyingbaoliu();
if(cha<1e-1)
break;
}
//cout<<"最終在收斂的范圍內左右邊界的最大差值: "<<cha<<endl;
//for(i=0;i<jiedeweishu;i++)
//{
// cout<<setiosflags(ios::fixed)<<setprecision(6)<<zuiyougeti->geti[i]<<",";
// }
//cout<<endl;

//cout<<"共用代數"<<gen<<endl;
cout<<"1185:"<<zuiyougeti->geti[0]<<"根"<<endl;
cout<<"1079:"<<zuiyougeti->geti[1]<<"根"<<endl;
cout<<"985:"<<zuiyougeti->geti[2]<<"根"<<endl;
cout<<"756:"<<zuiyougeti->geti[3]<<"根"<<endl;
cout<<"剩餘木料"<<(-zuiyougeti->shiying)<<endl;////////////////
cout<<endl;
for(i=0;i<jiedeweishu;i++)
{
yiwanchengshuliang[i]=yiwanchengshuliang[i]+zuiyougeti->geti[i];
}
muliaoshuliang++;

}
cout<<"用去木料:"<<muliaoshuliang<<"根"<<endl;
delete [] zuiyougetijicunqi;
delete [] zuiyougeti;

system("pause");
}
void initialize()
{
maxgen=20;//最大代數
gen=0;//起始代
cha=100;
chushi *chushizhongqunji;
chushizhongqunji=new chushi[glpgeshu];
int i,j;
for(i=0;i<jiedeweishu;i++)
{
zuobianjie1[i]=zuobianjie[i];
youbianjie1[i]=youbianjie[i];
}
float **glp_shu_zu;//第一次求解,為了使解更精確這一次求解需要的點最多
glp_shu_zu=new (float *[glpgeshu]);
for(i=0;i<glpgeshu;i++)
{
glp_shu_zu[i]=new float[jiedeweishu];//生成的glp向量用glp_shu_zu儲存
}
glp glp_qiu_jie_first(glpgeshu,jiedeweishu);//定義生成多少組glp向量和向量的維數
glp_qiu_jie_first.glp_qiu_jie(glp_shu_zu,sheng_cheng_xiang_liang);//將生成的glp向量用glp_shu_zu儲存,同時將生成向量帶入glp類
for(i=0;i<glpgeshu;i++)//產生初始種群
{
for(j=0;j<jiedeweishu;j++)
{
chushizhongqunji[i].geti[j]=sishewuru((zuobianjie[j]+(youbianjie[j]-(zuobianjie[j]))*glp_shu_zu[i][j]));
if(j==3&&glp_shu_zu[i][j]<0)
{
cout<<"274"<<endl;/////////////
cout<<zuobianjie[j]<<" "<<glp_shu_zu[i][j]<<" "<<youbianjie[j]<<endl;////////////////////
system("pause");///////////////////
}
}
}
for(i=0;i<glpgeshu;i++)//計算初始種群的適應度
{
mubiaohanshu1(chushizhongqunji[i]);
}
qsort(chushizhongqunji,glpgeshu,sizeof(chushi),&cmpshiyingjiang);//根據適應度將初始種群集按降序進行排列
chushi *youxiugetiku;//建立一個儲存優秀個體的庫
youxiugetiku=new chushi[glpgeshu];//建立一個儲存優秀個體的庫
int jishuqi=0;
i=0;
while(chushizhongqunji[i].shiying>zuiyougeti->shiying)//凡是比上一代的最優個體還要好的個體都放入優秀個體庫
{
for(int j=0;j<jiedeweishu;j++)
{
youxiugetiku[i].geti[j]=chushizhongqunji[i].geti[j];
//cout<<youxiugetiku[i].geti[j]<<endl;
}
//system("pause");
i++;
}
// cout<<i<<endl;//////////////
//system("pause");//////////////////////////////////////
jishuqi=i;//將得到的優秀個體的數量放入jishuqi保存
float *bianjiezancunqi;//下面就要以優秀個體庫中個體的范圍在成立一個局部搜索區域,所以先建立一個邊界暫存器
bianjiezancunqi=new float[jishuqi];
for(i=0;i<jiedeweishu;i++)
{
for(int j=0;j<jishuqi;j++)
{
bianjiezancunqi[j]=youxiugetiku[j].geti[i];//將優秀個體庫每一維的數據都放入bianjiezancunqi
}
qsort(bianjiezancunqi,jishuqi,sizeof(float),&cmp1);//對這些數據按降序排列,取兩個邊界又得到一個局部范圍
//將得到的范圍進行保存
zuobianjie[i]=bianjiezancunqi[jishuqi-1];
youbianjie[i]=bianjiezancunqi[0];
//cout<<zuobianjie[i]<<endl;//////////////////////////
// cout<<youbianjie[i]<<endl;///////////////////////////
//cout<<endl;///////////////////
//
if(zuobianjie[i]<zuobianjie2[i])//如果新得到的局部左邊界在上一代局部左邊界左邊,則左邊界取上一代的
{
zuobianjie[i]=zuobianjie2[i];
}
if(youbianjie[i]>youbianjie2[i])//如果新得到的局部右邊界在上一代局部右邊界右邊,則右邊界取上一代的
{
youbianjie[i]=youbianjie2[i];
}
}
if(chushizhongqunji[0].shiying>zuiyougeti->shiying)//本代種群的最優個體比歷史最有個個體好,則用本代的代替之,並將標志位賦值為1表示尋優成功
{
for(i=0;i<jiedeweishu;i++)
{
zuiyougeti->geti[i]=chushizhongqunji[0].geti[i];
}
zuiyougeti->shiying=chushizhongqunji[0].shiying;
biao=1;
}
delete [] bianjiezancunqi;
delete [] youxiugetiku;
for(i=0;i<glpgeshu;i++)
{
delete [] glp_shu_zu[i];
}
delete [] glp_shu_zu;
delete [] chushizhongqunji;
}
void jingyingbaoliu() //精英保留的實現
{
float glpshuliang,xiangliang[jiedeweishu];
if(biao==1)//如果尋優成功則利用局部搜索的數據
{
glpshuliang=glpgeshu1;
for(int i=0;i<jiedeweishu;i++)
{
xiangliang[i]=sheng_cheng_xiang_liang1[i];
}
}
else//否則利用全局搜索的數據
{
glpshuliang=glpgeshu2;
for(int i=0;i<jiedeweishu;i++)
{
xiangliang[i]=sheng_cheng_xiang_liang2[i];
}
}

chushi *chushizhongqunji;//建立一個用來儲存種群的容器
chushizhongqunji=new chushi[glpshuliang];
int i,j;

float **glp_shu_zu;//生成一個glp數組
glp_shu_zu=new (float *[glpshuliang]);
for(i=0;i<glpshuliang;i++)
{
glp_shu_zu[i]=new float[jiedeweishu];//生成的glp向量用glp_shu_zu儲存
}
glp glp_qiu_jie_first(glpshuliang,jiedeweishu);//定義生成多少組glp向量和向量的維數
glp_qiu_jie_first.glp_qiu_jie(glp_shu_zu,xiangliang);//將生成的glp向量用glp_shu_zu儲存,同時將生成向量帶入glp類
//cout<<"377"<<endl;
if(biao!=1)//如果尋優不成功則進入全局搜索
{
//cout<<"380"<<endl;////////////
float bianjiecha[jiedeweishu];
for(i=0;i<jiedeweishu;i++)
{
bianjiecha[i]=youbianjie3[i]-zuobianjie3[i];//計算上一代全局每一維范圍的寬度
}
static float rou=0.9;//定義收縮比
//float rou=pow(0.5,gen);
for(i=0;i<jiedeweishu;i++)//確定新的范圍
{
zuobianjie1[i]=zuiyougeti->geti[i]-rou*bianjiecha[i];//左邊界為以最優個體為中心-范圍寬度乘以收縮比
if(zuobianjie1[i]>zuobianjie2[i])//如果新的左邊界比目前局部左邊界大,那麼以目前的為全局尋優的左邊界
{
zuobianjie[i]=zuobianjie1[i];
zuobianjie3[i]=zuobianjie1[i];
}
else//否則以局部左邊界為全局左邊界
{
zuobianjie[i]=zuobianjie2[i];
zuobianjie3[i]=zuobianjie2[i];
}
youbianjie1[i]=zuiyougeti->geti[i]+rou*bianjiecha[i];//右邊界為以最優個體為中心+范圍寬度乘以收縮比
if(youbianjie1[i]<youbianjie2[i])
{
youbianjie[i]=youbianjie1[i];
youbianjie3[i]=youbianjie1[i];
}
else
{
youbianjie[i]=youbianjie2[i];
youbianjie3[i]=youbianjie2[i];
}
}
qsort(bianjiecha,jiedeweishu,sizeof(float),&cmp1);
if(cha==bianjiecha[0])//如果最大邊界差不變的話就將收縮因子變小
{
rou=pow(rou,2);
}

cha=bianjiecha[0];
}
//cout<<"421"<<endl;/////////////////////
for(i=0;i<glpshuliang;i++)//根據新產生的最優個體確定glp群
{
for(j=0;j<jiedeweishu;j++)
{
chushizhongqunji[i].geti[j]=sishewuru((zuobianjie[j]+(youbianjie[j]-(zuobianjie[j]))*glp_shu_zu[i][j]));
}
}
for(i=0;i<glpshuliang;i++)
{
mubiaohanshu1(chushizhongqunji[i]);
}
qsort(chushizhongqunji,glpshuliang,sizeof(chushi),&cmpshiyingjiang);
zuiyougetijicunqi->shiying=zuiyougeti->shiying;
if(chushizhongqunji[0].shiying>zuiyougeti->shiying)
{
for(i=0;i<jiedeweishu;i++)
{
zuiyougeti->geti[i]=chushizhongqunji[0].geti[i];
}
zuiyougeti->shiying=chushizhongqunji[0].shiying;
biao=1;
}
else
{
// cout<<"446"<<endl;/////////////
biao=0;
}

if(biao==1)//如果尋優成功了就需要確立一個新的局部最優解范圍
{
chushi *youxiugetiku;
youxiugetiku=new chushi[glpshuliang];
int jishuqi=0;
i=0;
while(chushizhongqunji[i].shiying>zuiyougetijicunqi->shiying)
{
for(int j=0;j<jiedeweishu;j++)
{
youxiugetiku[i].geti[j]=chushizhongqunji[i].geti[j];
}
i++;
}
jishuqi=i;
float *bianjiezancunqi;
bianjiezancunqi=new float[jishuqi];
for(i=0;i<jiedeweishu;i++)
{
for(int j=0;j<jishuqi;j++)
{
bianjiezancunqi[j]=youxiugetiku[j].geti[i];
}
qsort(bianjiezancunqi,jishuqi,sizeof(float),&cmp1);
zuobianjie[i]=bianjiezancunqi[jishuqi-1];
youbianjie[i]=bianjiezancunqi[0];
// cout<<zuobianjie[i]<<endl;//////////////
// cout<<youbianjie[i]<<endl;/////////////
// cout<<endl;///////////////
if(zuobianjie[i]<zuobianjie2[i])
{
zuobianjie[i]=zuobianjie2[i];
}
if(youbianjie[i]>youbianjie2[i])
{
youbianjie[i]=youbianjie2[i];
}
}
delete [] bianjiezancunqi;
delete [] youxiugetiku;
}

for(i=0;i<glpshuliang;i++)
{
delete [] glp_shu_zu[i];
}
delete [] glp_shu_zu;
delete [] chushizhongqunji;

}
void mubiaohanshu1(chushi &bianliang)//計算shiying
{
int i=0;
int sunshi,chanpin;
sunshi=qiegesushi*(bianliang.geti[0]+bianliang.geti[1]+bianliang.geti[2]+bianliang.geti[3]-1);
chanpin=chicun1*bianliang.geti[0]+chicun2*bianliang.geti[1]+chicun3*bianliang.geti[2]+chicun4*bianliang.geti[3];
bianliang.shiying=yuanmuchang-sunshi-chanpin;
if(bianliang.shiying!=0)//如果不能正好將木料分成所需尺寸則要多切一刀
{
sunshi=qiegesushi*(bianliang.geti[0]+bianliang.geti[1]+bianliang.geti[2]+bianliang.geti[3]);
}
if(bianliang.shiying<0)//罰函數
{
bianliang.shiying=bianliang.shiying+1e5;
}
bianliang.shiying=-bianliang.shiying;

}
int sishewuru(float x)
{
float y;
int z;
y=x-(int)x;
if(y<0.5)
{
z=(int)(x);
}
else
{
z=(int)x;
z=z+1;
}
return z;
}
glp.h源文件貼不下了,把你郵箱給我我發給你
郵箱:[email protected]

B. 學習C語言需要掌握哪些基本知識

1.入門程序

#include <stdio.h>
int main()
{
printf("Hello World!");
return 0;
}

2.數據類型

數據類型:

1.基本數據類型:

1.1. 整型:int 4個位元組

1.2. 字元型:char 1個位元組

1.3. 實型(浮點型)

C. acm競賽知識點

1. acm常用小知識點
acm常用小知識點 1.ACM 關於ACM程序設計競賽,需要掌握哪些知識點,最好能詳細一
訓練過ACM等程序設計競賽的人在演算法上有較大的優勢,這就說明當你編程能力提高之後,主要時間是花在思考演算法上,不是花在寫程序與debug上。

下面給個計劃你練練:第一階段:練經典常用演算法,下面的每個演算法給我打上十到二十遍,同時自己精簡代碼,因為太常用,所以要練到寫時不用想,10-15分鍾內打完,甚至關掉顯示器都可以把程序打出來。1.最短路(Floyd、Dijstra,BellmanFord) 2.最小生成樹(先寫個prim,kruscal要用並查集,不好寫) 3.大數(高精度)加減乘除4.二分查找. (代碼可在五行以內) 5.叉乘、判線段相交、然後寫個凸包. 6.BFS、DFS,同時熟練hash表(要熟,要靈活,代碼要簡) 7.數學上的有:輾轉相除(兩行內),線段交點、多角形面積公式. 8. 調用系統的qsort, 技巧很多,慢慢掌握. 9. 任意進制間的轉換第二階段:練習復雜一點,但也較常用的演算法。

如: 1. 二分圖匹配(匈牙利),最小路徑覆蓋 2. 網路流,最小費用流。 3. 線段樹. 4. 並查集。

5. 熟悉動態規劃的各個典型:LCS、最長遞增子串、三角剖分、記憶化dp 6.博弈類演算法。博弈樹,二進製法等。

7.最大團,最大獨立集。 8.判斷點在多邊形內。

9. 差分約束系統. 10. 雙向廣度搜索、A*演算法,最小耗散優先.第三階段: 前兩個階段是打基礎,第三階段是鍛煉在比賽中可以快速建立模型、想新演算法。這就要平時多做做綜合的題型了。

1. 把oibh上的論文看看(大概幾百篇的,我只看了一點點,呵呵)。 2. 平時掃掃zoj上的難題啦,別老做那些不用想的題.(中大acm的版主經常說我挑簡單的來做:-P ) 3. 多參加網上的比賽,感受一下比賽的氣氛,評估自己的實力. 4. 一道題不要過了就算,問一下人,有更好的演算法也打一下。

5. 做過的題要記好 :-)下面轉自:ACMer必備知識(任重而道遠。)

圖論 路徑問題 0/1邊權最短路徑 BFS 非負邊權最短路徑(Dijkstra) 可以用Dijkstra解決問題的特徵 負邊權最短路徑 Bellman-Ford Bellman-Ford的Yen-氏優化 差分約束系統 Floyd 廣義路徑問題 傳遞閉包 極小極大距離 / 極大極小距離 Euler Path / Tour 圈套圈演算法 混合圖的 Euler Path / Tour Hamilton Path / Tour 特殊圖的Hamilton Path / Tour 構造 生成樹問題 最小生成樹 第k小生成樹 最優比率生成樹 0/1分數規劃 度限制生成樹 連通性問題 強大的DFS演算法 無向圖連通性 割點 割邊 二連通分支 有向圖連通性 強連通分支 2-SAT 最小點基 有向無環圖 拓撲排序 有向無環圖與動態規劃的關系 二分圖匹配問題 一般圖問題與二分圖問題的轉換思路 最大匹配 有向圖的最小路徑覆蓋 0 / 1矩陣的最小覆蓋 完備匹配 最優匹配 穩定婚姻 網路流問題 網路流模型的簡單特徵和與線性規劃的關系 最大流最小割定理 最大流問題 有上下界的最大流問題 循環流 最小費用最大流 / 最大費用最大流 弦圖的性質和判定組合數學 解決組合數學問題時常用的思想 逼近 遞推 / 動態規劃 概率問題 Polya定理計算幾何 / 解析幾何 計算幾何的核心:叉積 / 面積 解析幾何的主力:復數 基本形 點 直線,線段 多邊形 凸多邊形 / 凸包 凸包演算法的引進,卷包裹法 Graham掃描法 水平序的引進,共線凸包的補丁 完美凸包演算法 相關判定 兩直線相交 兩線段相交 點在任意多邊形內的判定 點在凸多邊形內的判定 經典問題 最小外接圓 近似O(n)的最小外接圓演算法 點集直徑 旋轉卡殼,對踵點 多邊形的三角剖分數學 / 數論 最大公約數 Euclid演算法 擴展的Euclid演算法 同餘方程 / 二元一次不定方程 同餘方程組 線性方程組 高斯消元法 解mod 2域上的線性方程組 整系數方程組的精確解法 矩陣 行列式的計算 利用矩陣乘法快速計算遞推關系 分數 分數樹 連分數逼近 數論計算 求N的約數個數 求phi(N) 求約數和 快速數論變換 …… 素數問題 概率判素演算法 概率因子分解數據結構 組織結構 二叉堆 左偏樹 二項樹 勝者樹 跳躍表 樣式圖標 斜堆 reap 統計結構 樹狀數組 虛二叉樹 線段樹 矩形面積並 圓形面積並 關系結構 Hash表 並查集 路徑壓縮思想的應用 STL中的數據結構 vector deque set / map動態規劃 / 記憶化搜索 動態規劃和記憶化搜索在思考方式上的區別 最長子序列系列問題 最長不下降子序列 最長公共子序列 最長公共不下降子序列 一類NP問題的動態規劃解法 樹型動態規劃 背包問題 動態規劃的優化 四邊形不等式 函數的凸凹性 狀態設計 規劃方向線性規劃常用思想 二分 最小表示法串 KMP Trie結構 後綴樹/後綴數組 LCA/RMQ 有限狀態自動機理論排序 選擇/冒泡 快速排序 堆排序 歸並排序 基數排序 拓撲排序 排序網路。
2.ACM需要具備什麼知識
ACM國際大學生程序設計競賽(ACM/ICPC :ACM International Collegiate Programming Contest)是由國際計算機界歷史悠久、頗具權威性的組織ACM( 美國計算機協會)學會(Association for puter Machineary)主辦,是世界上公認的規模最大、水平最高的國際大學生程序設計競賽,其目的旨在使大學生運用計算機來充分展示自已分析問題和解決問題的能力。該項競賽從1970年舉辦至今已歷25屆,因歷屆競賽都薈萃了世界各大洲的精英,雲集了計算機界的「希望之星」,而受到國際各知名大學的重視,並受到全世界各著名計算機公司如Microsoft(微軟公司) 、IBM等的高度關注,成為世界各國大學生最具影響力的國際級計算機類的賽事,ACM所頒發的獲獎證書也為世界各著名計算機公司、各知名大學所認可。

該項競賽是年度性競賽,分區域預賽和國際決賽兩個階段進行,各預賽區第一名自動獲得參加世界決賽的資格,世界決賽安排在每年的3~4月舉行,而區域預賽安排在上一年的9月~12月在各大洲舉行。從1998年開始,IBM公司連續5年獨家贊助該項賽事的世界決賽和區域預賽。這項比賽是以大學為單位組隊(每支隊由教練、3名正式隊員,一名後備隊員組成)參賽,要求在5個小時內,解決5~8到題目。

ACM/ICPC的區域預賽是規模很大,范圍很廣的賽事,近幾年,全世界有1000多所大學, 2000多支參賽隊在六大洲的28~30個賽站中爭奪世界決賽的60~66個名額,去年我校舉辦的區域預賽,就有來自50多所高校的100多支隊伍參加,其激烈程度可想而知。

與其他編程競賽相比,ACM/ICPC題目難度更大,更強調演算法的高效性,不僅要解決一個指定的命題,而且必需要以最佳的方式解決指定的命題;它涉及知識面廣,與大學計算機系本科以及研究生如程序設計、離散數學、數據結構、人工智慧、演算法分析與設計等相關課程直接關聯,對數學要求更高,由於採用英文命題,對英語要求高,ACM/ICPC採用3人合作、共用一台電腦,所以它更強調團隊協作精神;由於許多題目並無現成的演算法,需要具備創新的精神,ACM/ICPC不僅強調學科的基礎,更強調全面素質和能力的培養。ACM/ICPC是一種全封閉式的競賽,能對學生能力進行實時的全面的考察,其成績的真實性更強,所以目前已成為內地高校的一個熱點,是培養全面發展優秀人材的一項重要的活動。概括來說就是:強調演算法的高效性、知識面要廣、對數學和英語要求較高、團隊協作和創新精神。
3.ACM需要那些方面的知識
一、語言是最重要的基本功 無論側重於什麼方面,只要是通過計算機程序去最終實現的競賽,語言都是大家要 過的第一道關。

亞洲賽區的比賽支持的語言包括C/C++與JAVA。筆者首先說說JAVA,眾所 周知,作為面向對象的王牌語言,JAVA在大型工程的組織與安全性方面有著自己獨特的 優勢,但是對於信息學比賽的具體場合,JAVA則顯得不那麼合適,它對於輸入輸出流的 操作相比於C++要繁雜很多,更為重要的是JAVA程序的運行速度要比C++慢10倍以上,而 競賽中對於JAVA程序的運行時限卻往往得不到同等比例的放寬,這無疑對演算法設計提出 了更高的要求,是相當不利的。

其實,筆者並不主張大家在這種場合過多地運用面向對 象的程序設計思維,因為對於小程序來說這不旦需要花費更多的時間去編寫代碼,也會 降低程序的執行效率。 接著說C和C++。

許多現在參加講座的同學還在上大一,C的基礎知識剛剛學完,還沒 有接觸過C++,其實在賽場上使用純C的選手還是大有人在的,它們主要是看重了純C在效 率上的優勢,所以這部分同學如果時間有限,並不需要急著去學習新的語言,只要提高 了自己在演算法設計上的造詣,純C一樣能發揮巨大的威力。 而C++相對於C,在輸入輸出流上的封裝大大方便了我們的操作,同時降低了出錯的 可能性,並且能夠很好地實現標准流與文件流的切換,方便了調試的工作。

如果有些同 學比較在意這點,可以嘗試C和C++的混編,畢竟僅僅學習C++的流操作還是不花什麼時間 的。 C++的另一個支持來源於標准模版庫(STL),庫中提供的對於基本數據結構的統一 介面操作和基本演算法的實現可以縮減我們編寫代碼的長度,這可以節省一些時間。

但是 ,與此相對的,使用STL要在效率上做出一些犧牲,對於輸入規模很大的題目,有時候必 須放棄STL,這意味著我們不能存在「有了STL就可以不去管基本演算法的實現」的想法; 另外,熟練和恰當地使用STL必須經過一定時間的積累,准確地了解各種操作的時間復雜 度,切忌對STL中不熟悉的部分濫用,因為這其中蘊涵著許多初學者不易發現的陷阱。 通過以上的分析,我們可以看出僅就信息學競賽而言,對語言的掌握並不要求十分 全面,但是對於經常用到的部分,必須十分熟練,不允許有半點不清楚的地方,下面我 舉個真實的例子來說明這個道理——即使是一點很細微的語言障礙,都有可能釀成錯誤 : 在去年清華的賽區上,有一個隊在做F題的時候使用了cout和printf的混合輸出,由 於一個帶緩沖一個不帶,所以輸出一長就混亂了。

只是因為當時judge team中負責F題的 人眼睛尖,看出答案沒錯只是順序不對(答案有一頁多,是所有題目中最長的一個輸出 ),又看了看程序發現只是輸出問題就給了個Presentation error(格式錯)。如果審 題的人不是這樣而是直接給一個 Wrong Answer,相信這個隊是很難查到自己錯在什麼地 方的。

現在我們轉入第二個方面的討論,基礎學科知識的積累。 二、以數學為主的基礎知識十分重要 雖然被定性為程序設計競賽,但是參賽選手所遇到的問題更多的是沒有解決問題的 思路,而不是有了思路卻死活不能實現,這就是平時積累的基礎知識不夠。

今年World Final的總冠軍是波蘭華沙大學,其成員出自於數學系而非計算機系,這就是一個鮮活的 例子。競賽中對於基礎學科的涉及主要集中於數學,此外對於物理、電路等等也可能有 一定應用,但是不多。

因此,大一的同學也不必為自己還沒學數據結構而感到不知從何 入手提高,把數學撿起來吧!下面我來談談在競賽中應用的數學的主要分支。 1、離散數學——作為計算機學科的基礎,離散數學是競賽中涉及最多的數學分支, 其重中之重又在於圖論和組合數學,尤其是圖論。

圖論之所以運用最多是因為它的變化最多,而且可以輕易地結合基本數據結構和許 多演算法的基本思想,較多用到的知識包括連通性判斷、DFS和BFS,關節點和關鍵路徑、歐拉迴路、最小生成樹、最短路徑、二部圖匹配和網路流等等。雖然這部分的比重很大 ,但是往往也是競賽中的難題所在,如果有初學者對於這部分的某些具體內容暫時感到 力不從心,也不必著急,可以慢慢積累。

競賽中設計的組合計數問題大都需要用組合數學來解決,組合數學中的知識相比於 圖論要簡單一些,很多知識對於小學上過奧校的同學來說已經十分熟悉,但是也有一些 部分需要先對代數結構中的群論有初步了解才能進行學習。組合數學在競賽中很少以難 題的形式出現,但是如果積累不夠,任何一道這方面的題目卻都有可能成為難題。

2、數論——以素數判斷和同餘為模型構造出來的題目往往需要較多的數論知識來解 決,這部分在競賽中的比重並不大,但只要來上一道,也足以使知識不足的人冥思苦想 上一陣時間。素數判斷和同餘最常見的是在以密碼學為背景的題目中出現,在運用密碼 學常識確定大概的過程之後,核心演算法往往要涉及數論的內容。

3、計算幾何——計算幾何相比於其它部分來說是比較獨立的,就是說它和其它的知 識點很少有過多的結合,較常用到的部分包括——線段相交的判斷、多邊形面積的計算 、內點外點的判斷、凸包等。
4.ACM需要那些方面的知識
一、語言是最重要的基本功 無論側重於什麼方面,只要是通過計算機程序去最終實現的競賽,語言都是大家要 過的第一道關。

亞洲賽區的比賽支持的語言包括C/C++與JAVA。筆者首先說說JAVA,眾所 周知,作為面向對象的王牌語言,JAVA在大型工程的組織與安全性方面有著自己獨特的 優勢,但是對於信息學比賽的具體場合,JAVA則顯得不那麼合適,它對於輸入輸出流的 操作相比於C++要繁雜很多,更為重要的是JAVA程序的運行速度要比C++慢10倍以上,而 競賽中對於JAVA程序的運行時限卻往往得不到同等比例的放寬,這無疑對演算法設計提出 了更高的要求,是相當不利的。

其實,筆者並不主張大家在這種場合過多地運用面向對 象的程序設計思維,因為對於小程序來說這不旦需要花費更多的時間去編寫代碼,也會 降低程序的執行效率。 接著說C和C++。

許多現在參加講座的同學還在上大一,C的基礎知識剛剛學完,還沒 有接觸過C++,其實在賽場上使用純C的選手還是大有人在的,它們主要是看重了純C在效 率上的優勢,所以這部分同學如果時間有限,並不需要急著去學習新的語言,只要提高 了自己在演算法設計上的造詣,純C一樣能發揮巨大的威力。 而C++相對於C,在輸入輸出流上的封裝大大方便了我們的操作,同時降低了出錯的 可能性,並且能夠很好地實現標准流與文件流的切換,方便了調試的工作。

如果有些同 學比較在意這點,可以嘗試C和C++的混編,畢竟僅僅學習C++的流操作還是不花什麼時間 的。 C++的另一個支持來源於標准模版庫(STL),庫中提供的對於基本數據結構的統一 介面操作和基本演算法的實現可以縮減我們編寫代碼的長度,這可以節省一些時間。

但是 ,與此相對的,使用STL要在效率上做出一些犧牲,對於輸入規模很大的題目,有時候必 須放棄STL,這意味著我們不能存在「有了STL就可以不去管基本演算法的實現」的想法; 另外,熟練和恰當地使用STL必須經過一定時間的積累,准確地了解各種操作的時間復雜 度,切忌對STL中不熟悉的部分濫用,因為這其中蘊涵著許多初學者不易發現的陷阱。 通過以上的分析,我們可以看出僅就信息學競賽而言,對語言的掌握並不要求十分 全面,但是對於經常用到的部分,必須十分熟練,不允許有半點不清楚的地方,下面我 舉個真實的例子來說明這個道理——即使是一點很細微的語言障礙,都有可能釀成錯誤 : 在去年清華的賽區上,有一個隊在做F題的時候使用了cout和printf的混合輸出,由 於一個帶緩沖一個不帶,所以輸出一長就混亂了。

只是因為當時judge team中負責F題的 人眼睛尖,看出答案沒錯只是順序不對(答案有一頁多,是所有題目中最長的一個輸出 ),又看了看程序發現只是輸出問題就給了個Presentation error(格式錯)。如果審 題的人不是這樣而是直接給一個 Wrong Answer,相信這個隊是很難查到自己錯在什麼地 方的。

現在我們轉入第二個方面的討論,基礎學科知識的積累。 二、以數學為主的基礎知識十分重要 雖然被定性為程序設計競賽,但是參賽選手所遇到的問題更多的是沒有解決問題的 思路,而不是有了思路卻死活不能實現,這就是平時積累的基礎知識不夠。

今年World Final的總冠軍是波蘭華沙大學,其成員出自於數學系而非計算機系,這就是一個鮮活的 例子。競賽中對於基礎學科的涉及主要集中於數學,此外對於物理、電路等等也可能有 一定應用,但是不多。

因此,大一的同學也不必為自己還沒學數據結構而感到不知從何 入手提高,把數學撿起來吧!下面我來談談在競賽中應用的數學的主要分支。 1、離散數學——作為計算機學科的基礎,離散數學是競賽中涉及最多的數學分支, 其重中之重又在於圖論和組合數學,尤其是圖論。

圖論之所以運用最多是因為它的變化最多,而且可以輕易地結合基本數據結構和許 多演算法的基本思想,較多用到的知識包括連通性判斷、DFS和BFS,關節點和關鍵路徑、歐拉迴路、最小生成樹、最短路徑、二部圖匹配和網路流等等。雖然這部分的比重很大 ,但是往往也是競賽中的難題所在,如果有初學者對於這部分的某些具體內容暫時感到 力不從心,也不必著急,可以慢慢積累。

競賽中設計的組合計數問題大都需要用組合數學來解決,組合數學中的知識相比於 圖論要簡單一些,很多知識對於小學上過奧校的同學來說已經十分熟悉,但是也有一些 部分需要先對代數結構中的群論有初步了解才能進行學習。組合數學在競賽中很少以難 題的形式出現,但是如果積累不夠,任何一道這方面的題目卻都有可能成為難題。

2、數論——以素數判斷和同餘為模型構造出來的題目往往需要較多的數論知識來解 決,這部分在競賽中的比重並不大,但只要來上一道,也足以使知識不足的人冥思苦想 上一陣時間。素數判斷和同餘最常見的是在以密碼學為背景的題目中出現,在運用密碼 學常識確定大概的過程之後,核心演算法往往要涉及數論的內容。

3、計算幾何——計算幾何相比於其它部分來說是比較獨立的,就是說它和其它的知 識點很少有過多的結合,較常用到的部分包括——線段相交的判斷、多邊形面積的計算 、內點外點的判斷、凸包等。
5.ACM需要具備什麼知識
ACM國際大學生程序設計競賽(ACM/ICPC :ACM International Collegiate Programming Contest)是由國際計算機界歷史悠久、頗具權威性的組織ACM( 美國計算機協會)學會(Association for puter Machineary)主辦,是世界上公認的規模最大、水平最高的國際大學生程序設計競賽,其目的旨在使大學生運用計算機來充分展示自已分析問題和解決問題的能力。該項競賽從1970年舉辦至今已歷25屆,因歷屆競賽都薈萃了世界各大洲的精英,雲集了計算機界的「希望之星」,而受到國際各知名大學的重視,並受到全世界各著名計算機公司如Microsoft(微軟公司) 、IBM等的高度關注,成為世界各國大學生最具影響力的國際級計算機類的賽事,ACM所頒發的獲獎證書也為世界各著名計算機公司、各知名大學所認可。

該項競賽是年度性競賽,分區域預賽和國際決賽兩個階段進行,各預賽區第一名自動獲得參加世界決賽的資格,世界決賽安排在每年的3~4月舉行,而區域預賽安排在上一年的9月~12月在各大洲舉行。從1998年開始,IBM公司連續5年獨家贊助該項賽事的世界決賽和區域預賽。這項比賽是以大學為單位組隊(每支隊由教練、3名正式隊員,一名後備隊員組成)參賽,要求在5個小時內,解決5~8到題目。

ACM/ICPC的區域預賽是規模很大,范圍很廣的賽事,近幾年,全世界有1000多所大學, 2000多支參賽隊在六大洲的28~30個賽站中爭奪世界決賽的60~66個名額,去年我校舉辦的區域預賽,就有來自50多所高校的100多支隊伍參加,其激烈程度可想而知。

與其他編程競賽相比,ACM/ICPC題目難度更大,更強調演算法的高效性,不僅要解決一個指定的命題,而且必需要以最佳的方式解決指定的命題;它涉及知識面廣,與大學計算機系本科以及研究生如程序設計、離散數學、數據結構、人工智慧、演算法分析與設計等相關課程直接關聯,對數學要求更高,由於採用英文命題,對英語要求高,ACM/ICPC採用3人合作、共用一台電腦,所以它更強調團隊協作精神;由於許多題目並無現成的演算法,需要具備創新的精神,ACM/ICPC不僅強調學科的基礎,更強調全面素質和能力的培養。ACM/ICPC是一種全封閉式的競賽,能對學生能力進行實時的全面的考察,其成績的真實性更強,所以目前已成為內地高校的一個熱點,是培養全面發展優秀人材的一項重要的活動。概括來說就是:強調演算法的高效性、知識面要廣、對數學和英語要求較高、團隊協作和創新精神。
6.ACM常用的經典演算法
大概分為數論演算法,圖論演算法,A*演算法。

數論演算法:

排序(選擇,冒泡,快速,歸並,堆,基數,桶排序等)

遞歸,回溯

概率,隨機

公約數,素數

因數分解

矩陣運算

線性規劃

最小二乘

微積分

多項式分解和級數

圖論演算法:

哈夫曼樹(即最優二叉樹)

哈希表

Prim,Kruskal演算法(即最小生成樹演算法)

紅黑樹

a-B剪枝法

深、廣度搜索

拓撲排序

強連通分量

Dijkstra,Bellman-Ford,Floyd-Warashall演算法(最短路徑演算法)

計算幾何(線段相交,凸包,最近點對)

A*演算法:

動態規劃

貪心演算法

KMP演算法

哈密頓迴路問題

子集問題

博弈(極大極小值演算法等)
7.參加ACM需要准備哪些知識
學ACM要熟練C語言的基礎語法,對編程有很大的興趣,還要學關於數據結構的知識。

內容大多數是考數據結構,例如:深度搜索(dfs)、廣度搜索(bfs)、並查集、母函數、最小生成樹、數論、動態規劃(重點)、背包問題、最短路、網路流……還有很多演算法,我列出這些是經常考到的,我也在學習上述所說的。 最好買一本《數據結構》或者關於演算法的書看看,看完一些要自己動手實踐做題,做題的話去杭電acm做題,裡面有很多很基礎的題,不錯的。

資料的話,網路有很多,我多數都是網路或者 *** ,還有可以看看別人的博客的解題報告,裡面有詳細的介紹,不懂還可以問問同學師兄的。 對了,還有一點,acm比賽都是英文題目的,比賽時帶本字典查吧。

希望我說的你能滿意,祝你能在acm方面有所收獲。

D. c語言貪心演算法智力大沖浪與花生採摘兩題

都是用C++寫的,不建議只用純C語言

#include <iostream>
#include <fstream>
#include <algorithm>
using namespace std;

struct Riddle {
int time;
int money;
};

struct gt{
bool operator()(Riddle& opl, Riddle& opr){
return opl.money > opr.money;
}
};

int main()
{
int m, n;
ifstream fin("riddle.in");
fin >> m >> n;
Riddle * riddles = new Riddle[n];
for (int i=0; i<n; ++i) {
fin >> riddles[i].time;
}
for (int i=0; i<n; ++i) {
fin >> riddles[i].money;
}
sort(riddles, riddles+n, gt() );

int * ridorder = new int[n];
for (int i=0; i<n; ++i) {
ridorder[i] = 0;
}
for (int i=0; i<n; ++i) {
int j;
for (j=riddles[i].time-1; j>=0 && ridorder[j]!=0; --j) {}

if (j >= 0) ridorder[j] = 1;
else m -= riddles[i].money;
}
cout << m << endl;
}

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;

#define maxn 55

struct Peanut
{
int x, y, num;
}peanut[maxn * maxn];

int n, m, t, pcount;

bool operator < (const Peanut &a, const Peanut &b)
{
return a.num > b.num;
}

void input()
{
pcount = 0;
scanf("%d%d%d", &n, &m, &t);
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++)
{
int a;
scanf("%d", &a);
if (a)
{
peanut[pcount].x = i + 1;
peanut[pcount].y = j + 1;
peanut[pcount].num = a;
pcount++;
}
}
}

void work()
{
int nowtime = peanut[0].x + 1;
if (nowtime + peanut[0].x > t)
{
printf("0\n");
return;
}
int ans = peanut[0].num;
for (int i = 1; i < pcount; i++)
{
nowtime += abs(peanut[i].x - peanut[i - 1].x) + abs(peanut[i].y - peanut[i - 1].y) + 1;
if (nowtime + peanut[i].x > t)
break;
ans += peanut[i].num;
}
printf("%d\n", ans);
}

int main()
{
//freopen("t.txt", "r", stdin);
int t;
scanf("%d", &t);
while (t--)
{
input();
sort(peanut, peanut + pcount);
work();
}
return 0;
}

E. C語言中prime的作用

prime的作用就是判斷一個數是否為素數(也稱「質數」)。

例如:

#include<stdio.h>

intIsPrime(intn)

{

if(n<=1)return0;

if(n%2==0)returnn==2;

for(inti=3;;i+=2)

{

if(i>n/i)break;//等價於i*i>n,不用開方

if(n%i==0)return0;

}

return1;

}

intmain()

{

for(intn=100;n<=300;n++)

if(IsPrime(n))

printf("%4d",n);

return0;

}

(5)貪心演算法一文搞懂擴展閱讀:

prime演算法

prime是以點為基礎出發進行檢索最小生成樹的一種貪心演算法。

思想:

將所有的點分成兩類,一類是已經放到碗里的,另一類是還沒有有放到碗里的,可以通過一個數組bool visit[]來記錄這個點到底是屬於第一類還是屬於第二類之後每一個周期索要進行的操作,找出一一定范圍內路徑的的范圍的最小值。

所有的從第一類點直接連接到第二類點的邊將最小的邊記錄下來(這個也就是生成樹中的一條邊)將這個新邊(這個一個連接第一類點和第二類點的邊)連到的那個第二類點歸類到第一類點中,之後重復這個操作,最終消滅所有的第二類點。

假設有n個節點,我最初給出一個點,以這個點開始進行搜索,這個時候該點為第一類點,其餘n-1個點為第二類點。之後進行n-1次操作,一共選出了n-1個邊(符合樹的性質),構成了最小生成樹。

閱讀全文

與貪心演算法一文搞懂相關的資料

熱點內容
硬體加密機性能測試 瀏覽:823
程序員貼面膜的正確方法 瀏覽:74
如何開啟app步數授權 瀏覽:22
linuxmaven路徑 瀏覽:137
python爬qq說說 瀏覽:416
linuxmap文件 瀏覽:67
轉轉app如何搜索快手主播 瀏覽:776
移動硬碟文件夾成0位元組 瀏覽:683
夢幻西遊解壓視頻大全 瀏覽:252
解壓小視頻手速 瀏覽:152
我的世界伺服器卡沒血如何修改 瀏覽:161
vba入門到精通pdf 瀏覽:113
tomcat怎麼一個伺服器部署 瀏覽:797
phphttps介面 瀏覽:895
javabyte數組int 瀏覽:810
公司網路共享的文件夾 瀏覽:1000
拍臉搭配衣服是什麼app 瀏覽:916
歐珀手機怎麼更改加密密碼 瀏覽:508
程序員那麼可愛陸漓氣人語錄 瀏覽:904
python中del刪除 瀏覽:461