case1:百雞問題,
三重迴圈的,在判斷/3時,因為是取整是去尾的,我用了(z+2)/3,這樣就不會因為去尾造成問題了
#includeusing namespace std;
int main()
} return 0;
}
其實可以優化為二重迴圈(王道上 迴圈變數x和y的範圍分別是100和100-x,這樣z就一定是》=0的了,我寫的還需要判斷z>=10,容易出錯)
#includeusing namespace std;
int main()
} return 0;
}
case2:找出所有滿足abc+bcc=532的abc。
#includeusing namespace std;
int main()
} return 0;
}
網上還看到一種方案,是按 每位來的
#includeint main()
}} }
return 0;
}
case3:old bill,金錢5位數,只能看到中間3位,給出買了的火雞數,問想要最貴的雞對應的首尾數字以及雞的單價
#includeusing namespace std;
int main()
}} if(!ok) printf("0\n");
} return 0;
}
注意的點:
case1:勝利大逃亡。板子題,記好咯。注意這裡在maze是int,若是char可能會出現讀入空格或換行,可以在%c前面加上空格解決該問題
#include#include#includeusing namespace std;
const int n=51;
int maze[n][n][n];//0是路,1是牆
int vis[n][n][n];
int a,b,c,ti;//a*b*c的maze,ti是限定時間
struct node s,v; //不過是兩個結構體變數, 後面經常會用到,沒有特別含義,
//若說有,那就是s更像temp,v用來表示next node(其實就是乙個s表示不下了而已
queueq;
int go[6][3]= ; //6個方向
int bfs()
} return -1;//bfs完了都沒return,說明沒出去
}int main() s,v;
queueq;
int vis[n][n][n];
int v,x,y;//體積,兩杯子容量
void a2b(int &a, int va, int &b, int vb)
else
}int check(int a,int b,int c)
int bfs()
a=s.a;
b=s.b;
c=s.c;
a2b(b,x,a,v);//b->a
if(!vis[a][b][c])
a=s.a;
b=s.b;
c=s.c;
a2b(a,v,c,y);//a->c
if(!vis[a][b][c])
a=s.a;
b=s.b;
c=s.c;
a2b(c,y,a,v);//c->a
if(!vis[a][b][c])
a=s.a;
b=s.b;
c=s.c;
a2b(b,x,c,y);//b->c
if(!vis[a][b][c])
a=s.a;
b=s.b;
c=s.c;
a2b(c,y,b,x);//c->b
if(!vis[a][b][c])
} return 0;
}int main()
} return 0;
}
case3:acute stroke,就是簡單的求「體積」,也就是聯通塊,但是犯了兩個非常經典的錯誤,小結一下:
#include#include#includeusing namespace std;
int a[62][1288][130];
int vis[62][1288][130];
int m,n,l,t;
struct node s,v;
queueq;
int go[6][3]= ;
int bfs(int x,int y,int z)
} }if(ans>=t) return ans;
else return 0;
}int main()
int main()
return 0;
}
case2:素數環問題 就是環內任意兩個數的sum必須是素數。這裡有些技巧
#include#includeusing namespace std;
const int n=17;//因為我是1~16,所以是17!
int prime= ; //15+16=31,最多到31就夠了
int n;
int ans[n];
int vis[n];
int check(int x)
return 0;
}void dfs(int num)
for(int i=2;i<=n;i++) }}
int main()
return 0;
}
case3:oil deposit,判斷聯通塊個數。dfs/bfs都可以,dfs**精簡,速度也不見得慢多少,比較沒有也回溯,一條路dfs到頭就行了,這裡dfs的功能就是把同乙個聯通塊都標記上,注意:
#include#includeusing namespace std;
const int n=101;
char maze[n][n];
int vis[n][n];
int m,n;
int go[8][2]= ;//8方向
int dfs(int x,int y) }}
int main() while(next_permutation(a.begin(),a.begin()+n));//不能到a.end() 但是用cin的話是可以的
printf("\n");//或者用puts("") 會自動加上換行
} return 0;
}
我自己基於dfs也寫了乙個像next_permutation那種,得到比原本「大」的排列,方法是用乙個變數控制後面的排列是否可以「隨便排」,比如原序列是213,排第一位的時候,必須是》=2才能排,如果排了2,第二位還是不能隨便排,必須是》=1,但是若第一位排了3,後面的就可以隨便排了。但是我沒實現「去重」,即111的排列結果會是6個111
#include#include#includeusing namespace std;
string s,ans;
int vis[26];
int n;
int dfs(int x, int is)
else if(s[i]==s[x])
} else if(is==1)
} }}int main()
return 0;
}
case5:tempter of the bone 要判斷是否可以在規定的時間點從s點到d點。又一起比較了dfs與bfs,這是存在性問題,適合dfs,且不能用bfs,因為bfs是在按照「最短路」走,這題完全不是這個意思,就是需要彎彎繞然後在規定時間到達終點。有乙個非常棒的剪枝操作:
#include#include#includeusing namespace std;
const int n=10;
char maze[n][n];
int vis[n][n];
int m,n,t,ans;
int sx,sy,dx,dy;//開始位置和門的位置
int go[4][2]= ;
void dfs(int x,int y,int step) else if(step>t || ans)
return ;
for(int i=0; i<4; i++) }}
int main()
else if(maze[i][j]=='d')
}//華麗的prune:奇偶性同,但t為奇數,不行;反之也不行
// if((sx+sy)&1==(dx+dy)&1 && t&1==1 || (sx+sy)&1!=(dx+dy)&1 && t&1==0)
else
} return 0;
}
王道機試 日期類問題
題目描述 有兩個日期,求兩個日期之間的天數,如果兩個日期是連續的我們規定他們之間的天數為兩天輸入 有多組資料,每組資料有兩行,分別表示兩個日期,形式為yyyymmdd輸出 每組資料輸出一行,即日期差值做題思路 樣例輸入 20110412 20110422樣例輸出 11對於日期類 年月日,就像學生資訊...
菜鳥的機試準備 王道機試指南 演算法筆記
字串雜湊 100000582 b 100000582 c 100000582 d 今天第幾天?清華 include include using namespace std int month tab 2 13 bool is leapyear int year intmain else 上邊的if ...
王道機試指南NO 4Day Of Week
時間限制 1s 記憶體限制 32mb輸入乙個日期,要求輸出該日期為星期幾 9 october 2001 14 october 2001 tuesday sunday 1 日期類問題,先預處理出每個日期與原點日期 0年1月1日 之間的天數間隔,存入buf三維陣列。2 看到題目考慮兩個問題 今天星期幾?...