2021年12月双周赛
循环基础-角谷猜想2
数组基础-掷骰子
跳马问题
一道简单的搜索题。
从点(0,0)出发,由于只能向右走,且走“日”字,所以有四个方向可以选择,于是用递归的方法从走到的这四个方向再开始搜索。
由于只能向右走,不可能走回头路,故不需要标记数组来标记这个点是否到过。
注意判断这个点在不在矩形范围内,如果点越界,直接return。
到达(n,m)点时用变量t累加答案,注意已经到达终点了不用再继续搜索。
#include<bits/stdc++.h> using namespace std; int m,n,t; void dfs(int a,int b){ if (a<0 || a>n || b>m) return; if (a==n && b==m){ t++; }else{ dfs(a+1,b+2); dfs(a+2,b+1); dfs(a-2,b+1); dfs(a-1,b+2); } } int main(){ cin>>n>>m; dfs(0,0); cout<<t; return 0; }
连续m个数的最小和
这道题可以边读入边处理。
用sum累积连续m个数的和。
若当前读入的数还没有m个,直接加到sum中;
若刚好m个,在加到sum中的同时,将ans初始化为sum;
若超过m个,那么sum应该加上当前第i个读入的数,再减去第i-m个读入的数,以保证sum是连续m个数的和(第i个数,第i-1个数,第i-2个数......第i-m+1个数)。再用sum和ans比较,若比ans小,则更新答案。
最后输出ans即可。
#include<bits/stdc++.h> using namespace std; int n,m; int a[3010]; int sum,ans; int main() { cin>>n>>m; for(int i=1;i<=n;i++) { cin>>a[i]; if(i<=m) { sum+=a[i]; if(i==m) ans=sum; } else { sum-=a[i-m]; sum+=a[i]; if(sum<ans) ans=sum; } } cout<<ans; return 0; }