A题:相当于每个数都可以对应到一个%k意义下的一个数 这些%k相同的数都可以通过加一些k变得相同,所以统计%k哪个最多即可
#include "bits/stdc++.h"
using namespace std;
#define int long long
const int maxn=1e5+10;
int a[maxn];
int n,k;
map<int,int >mp;
signed main()
{
cin>>n>>k;
for (int i=1;i<=n;i++)
{
cin>>a[i];
mp[a[i]%k]++;
}
int maxx=0;
for (auto i:mp)
{
maxx=max(maxx,i.second);
}
cout<<maxx;
}
B题:根据题意可得 当s.size()为奇数时,那么0 1的个数分别是奇数,偶数 (或是偶数,奇数)那么例如这种010100111串,可以先直接把相邻的00变成11 然后0101部分也可变换一下得到11111111 所以 一定是yes,
当s.size()为偶数时,并且0 1的个数都为偶数时,11001010 可以直接类似上面的变换 变成 全1或全0 ,当其中一个是奇数另一个一定也是奇数,那么通过上面的变换最后会多一个0或1 例如110111一定会多一个0
#include "bits/stdc++.h"
using namespace std;
#define int long long
const int maxn=1e5+10;
int a[maxn];
int T;
signed main()
{
cin>>T;
while (T--)
{
string s;
cin>>s;
int num=0;
for (int i=0;i<s.size();i++)
{
if (s[i]=='0')
{
num++;
}
}
if (s.size()%2==1) cout<<"Yes"<<endl;
else
{
if (num%2==1) cout<<"No"<<endl;
else cout<<"Yes"<<endl;
}
}
}
C题:直接跑一个堆优化dij
#include "bits/stdc++.h"
using namespace std;
#define int long long
const int maxn=1e5+10;
int n,m;
int a[2020][2020];
int f(int x,int y)
{
return x>=1 && y>=1 && x<=n && y<=m;
}
int dx[3]={0,0,1};
int dy[3]={-1,1,0};
struct node{
int x,y,val,dis;
bool operator> (const node &t) const
{
return dis>t.dis;
}
};
bool st[2020][2020];
int dis[2020][2020];
signed main()
{
cin>>n>>m;
for (int i=1;i<=n;i++)
{
for (int j=1;j<=m;j++)
{
cin>>a[i][j];
}
}
priority_queue<node,vector<node>,greater<node> >q;
memset(dis,0x3f,sizeof dis);
q.push({1,1,a[1][1],0});
dis[1][1]=0;
while (q.size())
{
auto t=q.top();
if (t.x==n && t.y==m)
{
cout<<t.dis;
return 0;
}
q.pop();
if (st[t.x][t.y]) continue;
st[t.x][t.y]=1;
for (int i=0;i<=2;i++)
{
int xx = dx[i];
int yy = dy[i];
if (f(t.x + xx, t.y + yy))
{
int vall;
if (a[t.x + xx][t.y + yy] == a[t.x][t.y])
{
vall = 1;
} else vall = 2;
if (dis[t.x+xx][t.y+yy]>vall+dis[t.x][t.y])
{
dis[t.x+xx][t.y+yy]=vall+dis[t.x][t.y];
q.push({t.x+xx,t.y+yy,a[t.x+xx][t.y+yy],t.dis+vall});
}
}
}
}
}
D题:
类似小白赛82 C题的状态机模型 有点麻烦但是也算是比较清楚 状态定义和转移在注释内 注意每个状态需要有26个出边 这样检查能保证不重不漏
#include "bits/stdc++.h"
using namespace std;
#define int long long
const int mod=1e9+7;
int n;
const int maxn=1e6+10;
int dp[maxn][10];
signed main()
{
cin>>n;
dp[1][6]=25;
dp[1][5]=1;
for (int i=2;i<=n;i++)
{
//dp[n][0]表示包含两个red子串的数量
//dp[n][0]=dp[n-1][0]*26+dp[n-1][1]
//dp[n][1]表示有一个red子串且结尾是re的数量
//dp[n][1]=dp[n-1][2];
//dp[n][2]表示有一个red子串且结尾是r的数量
//dp[n][2]=dp[n-1][3]+dp[n-1][2]+dp[n-1][1];
//dp[n][3]表示有一个red子串的数量且结尾是""的数量
//dp[n][3]=(dp[n-1][3])*25+24*(dp[n-1][1]+dp[n-1][2])+dp[n-1][4];
//dp[n][4]表示一个red子串都没有且结尾是re的数量
//dp[n][4]=dp[n-1][5]
//dp[n][5]表示一个red子串都没有且结尾是r的数量
//dp[n][5]=dp[n-1][6]+dp[n-1][5]+dp[n-1][4];
//dp[n][6]表示一个red子串都没有且结尾是""的数量
//dp[n][6]=24*(dp[n-1][5]+dp[n-1][4])+25*dp[n-1][6]
dp[i][0]=dp[i-1][0]*26+dp[i-1][1];
dp[i][1]=dp[i-1][2];
dp[i][2]=dp[i-1][3]+dp[i-1][2]+dp[i-1][1];
dp[i][3]=(dp[i-1][3])*25+24*(dp[i-1][1]+dp[i-1][2])+dp[i-1][4];
dp[i][4]=dp[i-1][5];
dp[i][5]=dp[i-1][6]+dp[i-1][5]+dp[i-1][4];
dp[i][6]=24*(dp[i-1][5]+dp[i-1][4])+25*dp[i-1][6];
for (int j=0;j<=6;j++)
{
dp[i][j]%=mod;
}
}
cout<<(dp[n][0]+mod)%mod;
}

京公网安备 11010502036488号