蓝桥杯思维题

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;
} 

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务