2.26训练赛

A.[传智杯 #3 决赛] 序列 

思路:数据范围较小,暴力即可做出,注意开long long

#include<bits/stdc++.h>
using namespace std;

void solve(){
	long long n,m,a[1005],sum=0;
	cin>>n>>m;
	for(int i=0;i<n;i++){
		cin>>a[i];
	}
	for(int i=0;i<n-1;i++){
		for(int j=i+1;j<n;j++){
			if(a[i]*a[j]<=m){
				sum++;
			}
		}
	}
	cout<<sum;
}


int main(){
	ios::sync_with_stdio(false); 
	cin.tie(0); cout.tie(0);
	int n=1;
	//cin>>n;
	while(n--){
		solve();
	}
}

B.[蓝桥杯 2022 省 B] 刷题统计 

思路:用day标记星期几,大于7时重新赋值为1

#include<bits/stdc++.h>
using namespace std;

void solve(){
	long long n,m,k,a[1005],sum=0,num=1,day=1;
	cin>>n>>m>>k;
	while(1){
		if(day==6||day==7){
			sum+=m;
		}
		else{
			sum+=n;
		}
		if(sum>=k){
			cout<<num;
			return ;
		}
		num++;
		day++;
		if(day==8){
			day=1;
		}
	}
}


int main(){
	ios::sync_with_stdio(false); 
	cin.tie(0); cout.tie(0);
	int n=1;
	//cin>>n;
	while(n--){
		solve();
	}
	return 0;
}

C.[蓝桥杯 2015 省 B] 移动距离 

思路:行数为(楼号-1)/排号宽度,若在偶数行则是正方向排号,列数就是楼号%排号宽度,反之则是排号宽度-楼号%排号宽度+1,两者的行数和列数分别绝对值相减再相加即可

#include<bits/stdc++.h>
using namespace std;

void solve(){
	long long n,m,k,sum=0,a1,a2,b1,b2;
	cin>>k>>n>>m;
	a1=(n-1)/k;
	if(a1%2==0){
		a2=n%k;
	}
	else{
		a2=k-n%k+1;
	}
	b1=(m-1)/k;
	if(b1%2==0){
		b2=m%k;
	}
	else{
		b2=k-m%k+1;
	}
	cout<<abs(abs(b2-a2)+abs(b1-a1))<<endl;
}


int main(){
	ios::sync_with_stdio(false); 
	cin.tie(0); cout.tie(0);
	int n=1;
	//cin>>n;
	while(n--){
		solve();
	}
	return 0;
}

D.[蓝桥杯 2020 国 C] 天干地支 

思路:模拟,打表

#include<bits/stdc++.h>
using namespace std;

void solve(){
	long long n;
	cin>>n;
	int a=n%10,b=n%12;
	if(a==1){
		cout<<"xin";
	}
	else if(a==2){
		cout<<"ren";
	}
	else if(a==3){
		cout<<"gui";
	}
	else if(a==4){
		cout<<"jia";
	}
	else if(a==5){
		cout<<"yi";
	}
	else if(a==6){
		cout<<"bing";
	}
	else if(a==7){
		cout<<"ding";
	}
	else if(a==8){
		cout<<"wu";
	}
	else if(a==9){
		cout<<"ji";
	}
	else if(a==0){
		cout<<"geng";
	}
	if(b==1){
		cout<<"you";
	}
	else if(b==2){
		cout<<"xu";
	}
	else if(b==3){
		cout<<"hai";
	}
	else if(b==4){
		cout<<"zi";
	}
	else if(b==5){
		cout<<"chou";
	}
	else if(b==6){
		cout<<"yin";
	}
	else if(b==7){
		cout<<"mao";
	}
	else if(b==8){
		cout<<"chen";
	}
	else if(b==9){
		cout<<"si";
	}
	else if(b==10){
		cout<<"wu";
	}
	else if(b==11){
		cout<<"wei";
	}
	else if(b==0){
		cout<<"shen";
	}
}


int main(){
	ios::sync_with_stdio(false); 
	cin.tie(0); cout.tie(0);
	int n=1;
	//cin>>n;
	while(n--){
		solve();
	}
	return 0;
}

E.[蓝桥杯 2016 省 AB] 四平方和 

思路:三重循环枚举前三个数,最后一个数用n-前三个数各自平方和赋值为p,再开个变量u=sqrt(p),因为sqrt函数默认向下取整,若u*u=p,则p存在为整数,输出即可

#include<bits/stdc++.h>
using namespace std;

void solve(){
	long long n;
	cin>>n;
	for(int i=0;i*i<=n;i++){
		for(int j=0;j*j<=n-i*i;j++){
			for(int k=0;k*k<=n-i*i-j*j;k++){
					long long p=n-i*i-j*j-k*k,u=sqrt(p);
					if(u*u==p){
						cout<<i<<' '<<j<<' '<<k<<' '<<u;
						return;
					}
			}
		}
	}
}


int main(){
	ios::sync_with_stdio(false); 
	cin.tie(0); cout.tie(0);
	int n=1;
	//cin>>n;
	while(n--){
		solve();
	}
	return 0;
}

F.[蓝桥杯 2019 国 C] 最长子序列 

思路:神奇的代码过了,......

#include<bits/stdc++.h>
using namespace std;

void solve(){
	string a,b;
	int sum=0,j,num=0,q=0,w=0;
	cin>>a>>b;
	for(int i=0;i<b.size();i++){
		for(j=w;j<a.size();j++){
			if(b[i]==a[j]){
				sum++;
				q=1;
				w=j+1;
				break;
			}
		}
		if(!q){
			w=j;
		}
		else{
			q=0;
			w=j;
		}
	}
	cout<<sum;
}


int main(){
	ios::sync_with_stdio(false); 
	cin.tie(0); cout.tie(0);
	int n=1;
	//cin>>n;
	while(n--){
		solve();
	}
	return 0;
}

G.[蓝桥杯 2017 国 C] 合根植物 

思路:简单的并查集,模板题

#include<bits/stdc++.h>
int n,m,k,a[1000005],sum=0;
using namespace std;
int find(int q){
	if(a[q]!=q){
		a[q]=find(a[q]);
	}
	return a[q];
}

void solve(){
	cin>>n>>m>>k;
	for(int i=1;i<=n*m;i++){
		a[i]=i;
	}
	for(int i=1;i<=k;i++){
		int b,c,d,f;
		cin>>b>>c;
		d=find(b);
		f=find(c);
		a[d]=f;
	}
	for(int i=1;i<=n*m;i++){
		if(a[i]==i){
			sum++;
		}
	}
	cout<<sum;
}


int main(){
	ios::sync_with_stdio(false); 
	cin.tie(0); cout.tie(0);
	int n=1;
	//cin>>n;
	while(n--){
		solve();
	}
	return 0;
}

H.[蓝桥杯 2023 国 B] 班级活动 

思路:模拟几种情况我们发现,假设id出现次数为1的个数为num,id出现次数大于2的个数为qum,当num大于qum时,只需要将qum与num配对,剩下的num自己配对,操作次数为两者之和除2,当qum大于等于num时,操作次数为qum

#include<bits/stdc++.h>
int n,a[100005],num,qum;
using namespace std;
unordered_map<int,int>v;

void solve(){
	cin>>n;
	for(int i=0;i<n;i++){
		cin>>a[i];
		v[a[i]]++;
	}
	for(int i=1;i<=v.size();i++){
		if(v[i]!=2&&v[i]!=0){
			if(v[i]==1){
				num++;
				v[i]=2;
			}
			else{
				qum+=v[i]-2;
				v[i]=2;
			}
		}
	}
	if(num>qum){
		cout<<(num+qum)/2;
	}
	else{
		cout<<qum;
	}
}


int main(){
	ios::sync_with_stdio(false); 
	cin.tie(0); cout.tie(0);
	int n=1;
	//cin>>n;
	while(n--){
		solve();
	}
	return 0;
}

I.[蓝桥杯 2013 国 C] 危险系数 

思路:对于关键点z,我们可以标记并遍历每个点(等于站点时continue),dfs不经过这个点时能不能连通站点,若不可以,则该危险系数+1

#include<bits/stdc++.h>
int n,m,a,b,u,v,sum;
int vis[1005];
using namespace std;
vector<int>e[1005];
queue<int>w;

bool solve(int x,int g,int h){
	if(!e[x].size()){
		return false;
	}
	vis[g]=1;
	w.push(g);
	while(!w.empty()){
		g=w.front();
		for(int i=0;i<e[g].size();i++){
			if(e[g][i]==x||vis[e[g][i]]){
				continue;
			}
			w.push(e[g][i]);
			vis[e[g][i]]=1;
			if(e[g][i]==h){
				while(!w.empty()){
					w.pop();
				};
				return false;
			}
		}
		w.pop();
	}
	
	return true;
}


int main(){
	ios::sync_with_stdio(false); 
	cin.tie(0); cout.tie(0);
	cin>>n>>m;
	for(int i=1;i<=m;i++){
		cin>>a>>b;
		e[a].push_back(b);
		e[b].push_back(a);
	}
	cin>>u>>v;
	if(solve(0,u,v)){
		cout<<"-1";
		return 0;
	}
	for(int i=1;i<=n;i++){
		if(i==u||i==v){
			continue;
		}
		if(solve(i,u,v)){
			sum++;
		}
		memset(vis,0,sizeof(vis));
	}
	cout<<sum;
	return 0;
}

J.[蓝桥杯 2019 国 C] 数正方形 

思路:组合数学,推出公式即可。题解

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int mod = 1e9+7;
int n,ans;
signed main()
{
	cin>>n;
	for(int i = 1;i<n;i++)
		ans+=i*(n-i)*(n-i),ans%=mod;
	cout<<ans;
	return 0;
}

K.[蓝桥杯 2023 省 A] 更小的数 

思路:位数相同时,从最高位看起,相同数位上的数大的数大

#include<bits/stdc++.h>
using namespace std;
string s;
int lens,ans;
bool pd(int l,int r)
{
	for(int i = l,j = r;i <= j;i++,j--)
	{
		if(s[i] > s[j]) return true;
        else if(s[j] > s[i]) return false;
	}
	return false;
}
int main()
{
	cin >> s;
	lens = s.length();
	for(int i = 0;i < lens;i++)
	{
		for(int j = i+1;j < lens;j++)
		{
			if(pd(i,j)) ans++;
		}
	}
	cout << ans;
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值