【LGR-276-Div.3】洛谷蓝桥杯省赛模拟赛 2026 - 洛谷
第一题
日期模板,但是有一点要注意的是在拆分日期时前导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;
}
第二题

这个题目拿到手其实我的想法是把第一场的开始时间用数组全部列出来,然后把第二场的时间全部列出来,从第一场的时间开始枚举第二场的时间,如果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;
}
第三题
其实就是一个模拟
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;
}
第四题
根据题目我们可以总结出一个规律
那么对于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;
}
第五题
这个我一看我用的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;
}
第六题
用了一个贪心,就是先排序,按照里目的地最远的进行排序,然后再依次访问有没有剩余
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;
}
第七题
暴力枚举每一段-》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;
}
第八题
看不懂不想做