蓝桥杯思维题
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; }