洛谷蓝桥杯模拟赛--备战蓝桥杯版

【LGR-276-Div.3】洛谷蓝桥杯省赛模拟赛 2026 - 洛谷

第一题

P15963 日期统计 - 洛谷

日期模板,但是有一点要注意的是在拆分日期时前导0不算

cpp 复制代码
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;

int cnt=0;
bool flag=false;

bool check(int y,int m,int d)
{
	int a[8];
    int idx = 0;
    
    // 年份4位
    a[idx++] = y / 1000;
    a[idx++] = (y / 100) % 10;
    a[idx++] = (y / 10) % 10;
    a[idx++] = y % 10;
    
    // 月份(没有前导0)
    if(m < 10)
    {
        a[idx++] = m;  // 只有1位
    }
    else
    {
        a[idx++] = m / 10;
        a[idx++] = m % 10;
    }
    
    // 日期(没有前导0)
    if(d < 10)
    {
        a[idx++] = d;  // 只有1位
    }
    else
    {
        a[idx++] = d / 10;
        a[idx++] = d % 10;
    }
    
    // 统计数字出现次数
    int b[10] = {0};
    for(int i = 0; i < idx; i++)
    {
        b[a[i]]++;
    }
    
    // 找出第一个出现数字的次数
    int first = 0;
    for(int i = 0; i <= 9; i++)
    {
        if(b[i] > 0)
        {
            first = b[i];
            break;
        }
    }
    
    // 检查所有出现的数字次数是否相同
    for(int i = 0; i <= 9; i++)
    {
        if(b[i] > 0 && b[i] != first)
        {
            return false;
        }
    }
    return true;
	
}

int main()
{
	for(int y=2023;y<=9876;y++)
	{
		for(int m=1;m<=12;m++)
		{
			for(int d=1;d<=31;d++)
			{
				if(m==1||m==3||m==5||m==7||m==8||m==10||m==12)
				{
					
				}
				else if(m==2)
				{
					if((y%4==0&&y%100!=0)||y%400==0)
					{
						if(d>29)continue;
					}
					else 
					{
						if(d>28)continue;
					}
				}
				else 
				{
					if(d>30)continue;
				}
				if(y==2239&&m==9&&d==9)
				{
					flag=true;
				} 
				if(flag)
				{
					if(check(y,m,d))
					{
						cnt++;
					}
				} 
				if(y==9876&&m==1&&d==1)
				{
					cout<<cnt<<endl;
					return 0;
				}
			}
		}
	}
	return 0;
} 

第二题

P15964 编程比赛 - 洛谷

这个题目拿到手其实我的想法是把第一场的开始时间用数组全部列出来,然后把第二场的时间全部列出来,从第一场的时间开始枚举第二场的时间,如果t1<t2那么cnt++

但是由于这个数据量实在是太大了,所以肯定会超时于是要进行优化

--》采用双指针的方式进行优化

cpp 复制代码
#include<iostream>
using namespace std;
typedef long long ll;

const int N = 901234;
const int M = 500001;

ll a[N+5];
ll b[M+5];

int main()
{
    a[1] = 789456;
    b[1] = 654321;
    
    for(int i = 2; i <= N; i++)
        a[i] = a[i-1] + 567890;
    
    for(int i = 2; i <= M; i++)
        b[i] = b[i-1] + 876543;
    
    ll cnt = 0;
    int j = 1;
    
    for(int i = 1; i <= N; i++)
    {
        while(j <= M && b[j] <= a[i])
            j++;
        if(j <= M)
            cnt += (M - j + 1);
    }
    
    cout << cnt << endl;
    return 0;
}

第三题

P15965 跳柱文明 - 洛谷

其实就是一个模拟

cpp 复制代码
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=1010;
int t;
int n;
int h[N];
int x;

int main()
{
	cin>>t;
	while(t--)
	{
		cin>>n>>x;
		int a[N];
		int k=0;
		bool flag=true;
		for(int i=1;i<=n;i++)
		{
			cin>>h[i];
		}
		for(int i=2;i<=n;i++)
		{
			a[k++]=h[i]-h[i-1]; 
		}
		
		for(int i=0;i<k;i++)
		{
			if(a[i]>1||a[i]<(-1)*x)
			{
				cout<<"Lose"<<endl;
				flag=false;
				break;
			}
		}
		if(flag)
		{
			cout<<"Win"<<endl;
		}
		
	}
	return 0;
} 

第四题

P15966 合成西瓜 - 洛谷

根据题目我们可以总结出一个规律

那么对于x,y

当x<=y的时候,也就是在基础等级当中找一个就可以达到要求--》ans=1;

如果x==y+1的时候,也就是目标等级是比基础等级的最高级的下一个,所以用0-y即可凑出也就是--》ans=x

在如果x>y+1那么可以发现--》ans=(y+1)*pow(2,x-y-1);

但在这个题目里,要用到快速幂算法

cpp 复制代码
ll qpow(ll a,ll b)
{
	ll res=1;
	while(b)
	{
		if(b&1)res=res*a%MOD;
		a=a*a%MOD;
		b>>=1;
	}
	return res;
}
cpp 复制代码
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long long ll;
const int MOD=998244353; 
int t;
ll x,y;

ll qpow(ll a,ll b)
{
	ll res=1;
	while(b)
	{
		if(b&1)res=res*a%MOD;
		a=a*a%MOD;
		b>>=1;
	}
	return res;
}

int main()
{
	cin>>t;
	while(t--)
	{
		cin>>x>>y;
		if(x<=y)
		{
			cout<<1<<endl;
		} 
		else if(x<=y+1)
		{
			cout<<x%MOD<<endl;
		}
		else
		{
			ll cnt=x-y-1;
			ll sum=y+1;
			ll ans=sum%MOD*qpow(2,cnt)%MOD;
			cout<<ans<<endl;
		}
		
	}
	return 0;
}

第五题

P15967 采矿文明 - 洛谷

这个我一看我用的dfs暴力做的,但是100分只拿到了5分

tle--5分版

cpp 复制代码
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=100010;
typedef long long ll;
int n,k;
ll m;
ll a[N],c[N];
ll res=0;

void dfs(int x,int num,ll sum,ll money)
{
	if(money<0)return;
	if(num>k)return; 
	if(x>n)
	{
		if(num<=k)
		{
			res=max(res,sum);
		}
		return;
	}
	if(x<n)
	{
		dfs(x+1,num,sum,money-c[x]);
	}
	else dfs(x+1,num,sum,money);
	if(money>=a[x])
	{
		if(x<n)
		{
			dfs(x+1,num+1,sum+a[x],money-a[x]-c[x]);
		}
		else dfs(x+1,num+1,sum+a[x],money-a[x]);
	}
}

int main()
{
	cin>>n>>m>>k;
	for(int i=1;i<=n-1;i++)
	{
		cin>>c[i];
	}
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
	}
	
	dfs(1,0,0,m);
	cout<<res<<endl;
	return 0;
} 

第六题

P15968 电梯接客 - 洛谷

用了一个贪心,就是先排序,按照里目的地最远的进行排序,然后再依次访问有没有剩余

cpp 复制代码
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long long ll;
const int N=1000010;
int n,x,y;
ll w;
struct node{
    int f;
    ll a;
}q[N];

bool cmp(node c, node b) {
    return abs(c.f - y) > abs(b.f - y);  // 按距离楼顶从远到近
}
int main()
{
	cin>>n>>x>>y>>w;
	for(int i=0;i<n;i++)
	{
		cin>>q[i].f>>q[i].a;
	}
	
	sort(q,q+n,cmp);
	
	ll t=0;
	bool first=true;
	int idx=0;
	
	while(idx<n)
	{
		while(idx<n&&q[idx].a==0)
		{
			idx++;
		}
		if(idx>=n)break;
		
		int ef=q[idx].f;
		
		if(first)
		{
			t+=abs(x-ef);
			t+=abs(ef-y);
			first=false;
		}
		else
		{
			t+=2*abs(y-ef);
		}
		
		ll cantake=w;
		
		for(int i=idx;i<n&&cantake>0;i++)
		{
			if(q[i].a>0)
			{
				ll take=min(q[i].a,cantake);
				cantake-=take;
				q[i].a-=take;
			}
		}
	}
	cout<<t<<endl;
	return 0;
} 

第七题

P15969 彩色装饰 - 洛谷

暴力枚举每一段-》tle拿到20分

cpp 复制代码
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N=1000010;

int n,m;
int a[N];
int b[N];

ll get(int x)
{
	long long total=0;
	for(int i=1;i<=n;i++)
	{
		for(int j=i;j<=n;j++)
		{
			for(int k=1;k<=n;k++)
	        {
		        b[k]=a[k];
	        }
			ll bea=1;
			for(int k=i;k<=j;k++)
			{
				b[k]=x;
			}
			
			for(int l=2;l<=n;l++)
			{
				if(b[l]!=b[l-1])
				{
					bea++;
				}
			}
			total+=bea;
		}
	}
	return total;
}

int main()
{
	cin>>n>>m;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
	}
	ll ans=0;
	for(int i=1;i<=m;i++)
	{
		cout<<get(i)<<endl;
	}
		return 0;
} 

第八题

看不懂不想做

相关推荐
我叫洋洋3 小时前
[Proteus 和 stm32f103c8t6]的使用控制OLED篇]
c语言·stm32·单片机·嵌入式硬件·蓝桥杯·proteus
酉鬼女又兒12 小时前
零基础快速入门前端蓝桥杯Web备考:BOM与定时器核心知识点详解(可用于备赛蓝桥杯Web应用开发)
开发语言·前端·javascript·职场和发展·蓝桥杯
wanderist.13 小时前
从Nim游戏到SG函数
c++·算法·蓝桥杯
daxi15013 小时前
C语言从入门到进阶——第17讲:字符串函数
c语言·开发语言·算法·蓝桥杯
wljy114 小时前
第十四届蓝桥杯大赛软件赛省赛C/C++ 大学 B 组(个人见解,已完结)
c语言·c++·算法·蓝桥杯
Trouvaille ~14 小时前
【优选算法篇】拓扑排序——逻辑先后与任务依赖的终极拆解
数据结构·c++·算法·leetcode·青少年编程·蓝桥杯·拓扑学
bearpping15 小时前
MacOs安装Redis并设置为开机、后台启动
redis·macos·蓝桥杯
阿i索15 小时前
【蓝桥杯备赛Day4】基础算法
笔记·算法·蓝桥杯
酉鬼女又兒1 天前
零基础快速入门前端CSS Transform 与动画核心知识点及蓝桥杯 Web 应用开发考点解析(可用于备赛蓝桥杯Web应用开发)
开发语言·前端·css·职场和发展·蓝桥杯·html