蓝桥杯思维题
1.k倍区间
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll N=1e5;
ll f[N];
int main(){
ll n,k;
cin>>n>>k;
ll a[n+1]={0};
ll sum=0;
f[0]=1;
for(ll i=1;i<=n;i++){
cin>>a[i];
a[i]+=(a[i-1]);
sum+=f[a[i]%k];//如果是两个数字取余k后得到的数字都是一样的,那他们两个之间所剩下的那个部分,就是k的倍数
f[a[i]%k]++;
}
cout<<sum;
return 0;
}
2.数字接龙(dfs)
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll N=11;
ll way[N][N];
ll n;
ll k;
string path;
int dx[8] = {-1, -1, 0, 1, 1, 1, 0, -1};
int dy[8] = {0, 1, 1, 1, 0, -1, -1, -1};
bool st[N][N];
bool edge[N][N][N][N];
bool dfs(ll a,ll b){
if(a==n-1&&b==n-1){
return path.size()==n*n-1;
}
st[a][b]=true;
for(ll i=0;i<8;i++){
ll x=a+dx[i],y=b+dy[i];
if(x<0||y<0||x>=n||y>=n)continue;
if(st[x][y])continue;
if(way[x][y]!=(way[a][b]+1)%k)continue;
if((i%2)&&(edge[a][y][x][b]||edge[x][b][a][y]))continue;
edge[a][b][x][y]=true;
path+=i+'0';
if(dfs(x,y))return true;
path.pop_back();
edge[a][b][x][y]=false;
}
st[a][b]=false;
return false;
}
int main(){
cin>>n;
cin>>k;
for(ll i=0;i<n;i++){
for(ll g=0;g<n;g++){
cin>>way[i][g];
}
}
if(!dfs(0,0)){
cout<<-1;
}
else{
cout<<path;
}
return 0;
}
3.错误票据(简单化算法)
#include <bits/stdc++.h>
using namespace std;
const int N=1e5;
int shu[N]={0};
int main(){
int a;
int m1=-1;
int m2=1000000;
int ci;
cin>>ci;
while(ci--){//控制输入的行数
while(cin>>a){//负责每一行的每一个元素的输入,遇到换行符就自动停止了
m1=max(m1,a);
m2=min(m2,a);
shu[a]++;
}
}
int c,q;
for(int i=m2;i<=m1;i++){
if(shu[i]==0){
q=i;
}
if(shu[i]==2){
c=i;
}
}
cout<<q<<" "<<c<<endl;
//cout<<m2<<" "<<m1;
return 0;
}

查看13道真题和解析