开始: 2021-12-11 15:00:00

2021年12月双周赛

结束: 2021-12-11 18:00:00
当前: 2025-0505-3131 13:53:18  类型:OI 状态:已经结束 

循环基础-角谷猜想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; }