阶乘末尾0的个数
分析
考虑0是5和2贡献出来的,但是因子2出现的频率高得多,所以统计因子5的个数就好了。给了多种写法。
参考代码
//第一种
#include <iostream>
#include <cstdio>
using namespace std;
int solve(int n){
int cnt = 0;
while(n){
cnt += n / 5;
n = n / 5;
}
return cnt;
}
int main(){
int n;
cin >> n;
cout << solve(n) << endl;
}
//第二种
#include <iostream>
#include <cstdio>
using namespace std;
int solve(int n){
int cnt = 0;
for(int i = 5; i <= n; i += 5){
int res = i;
while (res % 5 == 0){
cnt++;
res /= 5;
}
}
return cnt;
}
int main(){
int n;
cin >> n;
cout << solve(n) << endl;
}
#数据范围比较小,直接用python也是可以的
n = int(raw_input())
ans = 1;
for i in range(1,n+1):
ans *= i
count = 0
for i in range(len(str(ans))-1,-1,-1):
if(str(ans)[i] == '0'):
count += 1
else:
break
print count
地下迷宫
分析
根据题设,可以简单证明最短路径一定体力消耗最小的路径。因为横向移动m-1是必须的,而纵向的路径越短,需要的体力就越少。
直接bfs然后记录一下路径即可,dfs应该也是可以的吧。
参考代码
#include <iostream>
#include <cstdio>
#include <queue>
using namespace std;
int _map[15][15];
int vis[15][15];
int m,n,P;
struct node{
int x,y,v;
}ans[15][15];
bool bfs(){
queue<node> q;
node tmp;
tmp.x = 0,tmp.y = 0,tmp.v = P;
q.push(tmp);
while(!q.empty()){
node tmp = q.front();
q.pop();
if(tmp.x == 0 && tmp.y == m - 1 && tmp.v >= 0) return true;
if(tmp.x + 1 <= n - 1 && _map[tmp.x + 1][tmp.y] && !vis[tmp.x + 1][tmp.y]){
node temp;
temp.x = tmp.x + 1;
temp.y = tmp.y;
temp.v = tmp.v;
ans[temp.x][temp.y].x = tmp.x;
ans[temp.x][temp.y].y = tmp.y;
vis[temp.x][temp.y] = 1;
q.push(temp);
}
if(tmp.y + 1 <= m - 1 && _map[tmp.x][tmp.y + 1] && !vis[tmp.x][tmp.y + 1] && tmp.v > 0){
node temp;
temp.x = tmp.x;
temp.y = tmp.y + 1;
temp.v = tmp.v - 1;
ans[temp.x][temp.y].x = tmp.x;
ans[temp.x][temp.y].y = tmp.y;
vis[temp.x][temp.y] = 1;
q.push(temp);
}
if(tmp.x - 1 >= 0 && _map[tmp.x - 1][tmp.y] && !vis[tmp.x - 1][tmp.y] && tmp.v >= 3){
node temp;
temp.x = tmp.x - 1;
temp.y = tmp.y;
temp.v = tmp.v - 3;
ans[temp.x][temp.y].x = tmp.x;
ans[temp.x][temp.y].y = tmp.y;
vis[temp.x][temp.y] = 1;
q.push(temp);
}
if(tmp.y - 1 >= 0 && _map[tmp.x][tmp.y - 1] && !vis[tmp.x][tmp.y - 1] && tmp.v > 0){
node temp;
temp.x = tmp.x;
temp.y = tmp.y - 1;
temp.v = tmp.v - 1;
ans[temp.x][temp.y].x = tmp.x;
ans[temp.x][temp.y].y = tmp.y;
vis[temp.x][temp.y] = 1;
q.push(temp);
}
}
return false;
}
void pri(int sx,int sy) {
if( sx == 0 && sy == 0) {
printf("[0,0]");
return ;
}
pri(ans[sx][sy].x,ans[sx][sy].y);
printf(",[%d,%d]", sx,sy);
}
int main(){
cin >> n >> m >> P;
for(int i = 0; i < n; i++){
for(int j = 0; j < m; j++){
cin >> _map[i][j];
}
}
if(bfs()){
pri(0, m - 1);
printf("\n");
}
else cout << "Can not escape!" << endl;
return 0;
}
#滴滴##Java工程师##C++工程师##安卓工程师##前端工程师##算法工程师#