牛客小白月赛131

牛客小白月赛131

Lionlnuc
Lionlnuc Lv4

A 小红的 7

思路:

打表

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
map<string,int>mp;
void solve()
{
string s;
cin>>s;
int n=6;

cout<<mp[s]<<endl;
}
signed main(){
IOS
int t=1;
cin>>t;
mp["142857"]=1;
mp["285714"]=2;
mp["428571"]=3;
mp["571428"]=4;
mp["714285"]=5;
mp["857142"]=6;
while(t--)
{
solve();
}
}

B 小红的回文串

思路:

别问我为什么 WA 三发。
找中间连续的长度就行。

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
void solve()
{
int n;
cin>>n;
string s;
cin>>s;
int l=(n-1)/2;
int r=n/2;
while(l>=0&&r<n&&s[l]==s[r]){
l--,r++;
}
cout<<r-l-1<<endl;
}

C 小红的 gcd 位运算构造

思路:

二进制吧,按位与结果为 0 说明 y 的二进制为 1 的位置都在 x 的二进制位为 0 的位置。
如果是偶数直接输出 1 即可。如果是奇数,那么从低位开始找 x 的二进制第一个为 0 的位置 i, 输出。

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
void solve()
{
int x;
cin>>x;
int ans=1;
if(x%2==0){
cout<<"1"<<endl;
return;
}
for(int i=0;i<31;i++){
if(((x>>i)&1)==0){
ans=ans<<i;
cout<<ans<<endl;
break;
}
}
}

D i 在西元前

思路:

模拟吧。
复数乘法:
一个复数序列
等比即
所以可以检验 ,写成 $z_2z_{i-1}=z_1z_i$
所以用循环去检查就行。
代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#define YES cout<<"Yes\n";
#define NO cout<<"No\n";
const int N=1e5+5;
int a[N],b[N];
void solve()
{
int n;
cin>>n;
for(int i=1;i<=n;i++)cin>>a[i]>>b[i];
bool flag=1;
for(int i=2;i<=n;i++){
int aa,bb,c,d;
aa=a[i]*a[1]-b[i]*b[1];
bb=a[i]*b[1]+a[1]*b[i];
c=a[i-1]*a[2]-b[i-1]*b[2];
d=a[i-1]*b[2]+b[i-1]*a[2];
if(aa!=c||bb!=d){
flag=0;
break;
}
}
if(flag)YES
else NO
}

E 小红打游戏

思路:

0/1 背包+完全背包。直接套板子就行。
二维数组开不了那么大,直接把上限都卡在 就行。

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
const int N=2e4+5;
int a[N],b[N],c[N];
int dp[1100][1100];
void solve()
{
int n,k;
cin>>n>>k;
int x,y;
cin>>x>>y;
for(int i=0;i<=x;i++){
for(int j=0;j<=y;j++)dp[i][j]=1e18;
}
dp[0][0]=0;
for(int i=1;i<=n;i++){
cin>>a[i]>>b[i]>>c[i];
}
for(int i=1;i<=k;i++){
for(int j=x;j>=0;j--){
for(int p=y;p>=0;p--){
if(dp[j][p]==1e18)continue;
int mx=min(x,j+a[i]);
int my=min(y,p+b[i]);
dp[mx][my]=min(dp[mx][my],dp[j][p]+c[i]);
}
}
}
for(int i=k+1;i<=n;i++){
for(int j=0;j<=x;j++){
for(int p=0;p<=y;p++){
if(dp[j][p]==1e18)continue;
int mx=min(x,j+a[i]);
int my=min(y,p+b[i]);
dp[mx][my]=min(dp[mx][my],dp[j][p]+c[i]);
}
}
}
if(dp[x][y]!=1e18){
cout<<dp[x][y]<<endl;
}else cout<<"-1"<<endl;
}
  • 标题: 牛客小白月赛131
  • 作者: Lionlnuc
  • 创建于 : 2026-04-10 00:00:00
  • 更新于 : 2026-04-10 00:00:00
  • 链接: https://lionlnuc.github.io/2026/04/10/牛客小白月赛131/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论