第一题
进制之间的转换这个题目考的是九进制转十进制
第二题
考的时日期问题--》用那个日期模板枚举然后找到符合条件的日期数
cpp
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
bool check(int y,int m,int d)
{
int x=y*10000+m*100+d;
int a[10];
int k=0;
while(x)
{
a[k++]=x%10;
x/=10;
}
int last=0;
for(int i=k-1;i>=2;i--)
{
if(a[i]==(a[i-1]-1)&&a[i-1]==(a[i-2]-1))
{
return true;
}
}
return false;
}
int main()
{
bool falg=false;
int cnt=0;
for(int y=2022;y<=2023;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)break;
}
else
{
if(d>28)break;
}
}
else
{
if(d>30)break;
}
if(check(y,m,d))
{
cnt++;
}
if(y==2022&&m==12&&d==31)
{
cout<<cnt<<endl;
return 0;
}
}
}
}
}
第三题

这个题目还是比较简单的,但是因为我直接模拟的,所以占用时间比较多最后超时了,但是还是拿到了大部分的分数,如果想要优化的话还是得提前先处理一下数据
tle版
cpp
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
ll a,b,n;
int main()
{
cin>>a>>b>>n;
ll cnt=0;
ll day=0;
while(cnt<n)
{
day++;
if(day%7==6||day%7==0)
{
cnt+=b;
}
else cnt+=a;
}
cout<<day<<endl;
return 0;
}
正确版
cpp
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
int main()
{
ll a,b,n;
cin>>a>>b>>n;
ll week=a*5+b*2;
ll weeks=n/week;
ll remain=n%week;
ll days=weeks*7;
//处理剩余部分
if(remain>0)
{
ll sum=0;
for(int i=1;i<=7;i++)
{
if(i==6||i==7)
{
sum+=b;
}
else sum+=a;
days++;
if(sum>=remain)break;
}
}
cout<<days<<endl;
return 0;
}
第四题
这个题目又是一个找规律的题目

cpp
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int n;
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
cout<<max(n-i,i-1)*2<<endl;
}
return 0;
}
第五题
不想看题目一看感觉就是不会做的题目直接跳过
第六题
二维前缀和问题,先用二位前缀和记录矩阵和,然后根据上下界然后双指针枚举两个y
cpp
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=510;
typedef long long ll;
int n,m;
ll k;
ll g[N][N];
ll sum[N][N];
ll getsum(int x1,int y1,int x2,int y2)
{
return sum[x2][y2]-sum[x2][y1-1]-sum[x1-1][y2]+sum[x1-1][y1-1];
}
int main()
{
cin>>n>>m;
cin>>k;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
cin>>g[i][j];
sum[i][j]=sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1]+g[i][j];
}
}
ll ans=0;
for(int i=1;i<=n;i++)
{
for(int j=i;j<=n;j++)
{
for(int l=1,r=1;r<=m;r++)
{
while(l<=r&&getsum(i,l,j,r)>k)l++;
if(l<=r)ans+=r-l+1;
}
}
}
cout<<ans<<endl;
return 0;
}
第七题
第八题
对每个格子进行扫描,扫描周围八个格子里有几个雷然后最后输出
cpp
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int N=110;
int n,m;
int g[N][N];
int dx[8]={0,0,-1,1,1,1,-1,-1};
int dy[8]={1,-1,0,0,1,-1,1,-1};
int d[N][N];
int main()
{
cin>>n>>m;
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
cin>>g[i][j];
}
}
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
if(g[i][j]==1)
{
d[i][j]=9;
}
else
{
for(int k=0;k<8;k++)
{
int nx=i+dx[k];
int ny=j+dy[k];
if(nx>=0&&nx<n&&ny>=0&&ny<=n&&g[nx][ny]==1)
{
d[i][j]++;
}
}
}
}
}
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
cout<<d[i][j];
if(j<m-1)cout<<' ';
}
cout<<endl;
}
return 0;
}
第九题
一眼dfs暴力搜索!!又得到tle了哈哈哈哈但是拿到了一半的分
这个就是枚举当前位置到底是花还是店,注意的是限定条件比较多--》酒正好喝完,m个花,n个店--》最后一步一定是花
tle版
cpp
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=210,MOD=1000000007;
int n,m;
int a[N];
int cnt=0;
void dfs(int x,int sum,int hua,int dian)//sum剩下的酒
{
if(hua>m||dian>n||sum<0)return;
if(x==n+m-1)
{
if(sum==1&&dian==n&&hua==m-1)
{
cnt = (cnt + 1) % MOD;
}
return;
}
//店
if(dian<n)
{
dfs(x+1,sum+sum,hua,dian+1);
}
//花
if(hua<m)
{
dfs(x+1,sum-1,hua+1,dian);
}
}
int main()
{
cin>>n>>m;
dfs(0,2,0,0);
cout<<cnt%MOD<<endl;
return 0;
}
第十题
我看到最大最小我以为是用二分,结果二分写了一对没写出来😪然后就没写了