牛客练习赛67水题

Powered by:AB_IN 局外人

A 牛牛爱字符串

用的 P y t h o n Python 做的,可能因为 P y t h o n Python 去前置0比较方便。。。
代码挺好懂的。

while True:
    try:
        s=input()
        s1=''
        for i in s:
            if i.isdigit()==True:
                s1+=i
            elif s1!='':
                print(int(s1),end=" ")
                s1=''
        if s1!='':
            print(int(s1),end="")
        print()
    except:
        break

找符合的序列怎么少的了我正则表达式??

import re
while True:
    try:
        s=input()
        reg='\\d+'
        res=re.findall(reg, s)
        print(' '.join(map(str,list(map(int,res)))))
    except:
        break

B 牛牛爱位运算

  • & \& 运算规则就是两个数的二进制位上,对应都是1,才会是1。
    那么 a & b a\&b 最好的情况就是不减少( a = b a=b ),题目中没有要求一定要进行与运算,所以取最大的即可
  • 或者, a & b a , b a\&b \leq a,b 。所以 a 1 & a 2 & . . . . . & a k a 1 , a 2 , . . . . . , a k m a x ( a 1 , a 2 , . . . . . , a k ) a_1\&a_2\&.....\&a_k \leq a_1,a_2,.....,a_k\leq max(a_1,a_2,.....,a_k)
t=int(input())
while t>0:
    t-=1
    lst=list(map(int ,input().split()))
    lst.pop(0)
    print(max(lst)) 

C 牛牛爱博弈

打个表就可以看出来。

for _ in range(int(input())):
    n=int(input())
    n%=3
    if n==0:
        print("Frame")
    else:
        print("Alan")

D 牛妹爱数列

一路 d p dp 过去就行了。
d p [ i ] [ 0 / 1 ] dp[i][0/1] ,表示在 i i 这个位置之前的数全为 0 / 1 0/1

  • a [ i ] = 1 a[i]=1
    • d p [ i ] [ 1 ] = m i n ( d p [ i 1 ] [ 1 ] , d p [ i 1 ] [ 0 ] + 1 ) dp[i][1]=min(dp[i-1][1],dp[i-1][0]+1)
      • d p [ i ] [ 1 ] dp[i][1] 相当于 1111111 1111111 (设 i = 7 i=7 )
      • d p [ i 1 ] [ 1 ] dp[i-1][1] 相当于 111111 111111 ,这时候直接加上 a [ i ] a[i] 就行了,值不变。
      • d p [ i ] [ 0 ] dp[i][0] 相当于 000000 000000 , 加上 a [ i ] a[i] 变成 0000001 0000001 ,则需要单点修改
    • d p [ i ] [ 0 ] = m i n ( d p [ i 1 ] [ 1 ] + 1 , d p [ i 1 ] [ 0 ] + 1 ) dp[i][0]=min(dp[i-1][1]+1,dp[i-1][0]+1)
      • d p [ i ] [ 0 ] dp[i][0] 相当于 0000000 0000000 (设 i = 7 i=7 )
      • d p [ i 1 ] [ 1 ] dp[i-1][1] 相当于 111111 111111 ,加上 a [ i ] a[i] 变成 1111111 1111111 ,要都变成 0 0 ,需要一次前缀修改
      • d p [ i ] [ 0 ] dp[i][0] 相当于 000000 000000 , 加上 a [ i ] a[i] 变成 0000001 0000001 ,要都变成 0 0 ,则需要单点修改
  • a [ i ] = 0 a[i]=0
    • 同理
#include<bits/stdc++.h>
#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
using namespace std;
const int N=1e5+10;
int n,dp[N][3],a[N];
int main()
{
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>a[i];
        if(a[i]){
            dp[i][1]=min(dp[i-1][1],dp[i-1][0]+1);
            dp[i][0]=min(dp[i-1][1]+1,dp[i-1][0]+1);
        }
        else{
            dp[i][0]=min(dp[i-1][0],dp[i-1][1]+1);
            dp[i][1]=min(dp[i-1][0]+1,dp[i-1][1]+1);
        }
    }
    cout<<dp[n][0]<<endl;
}

完结。

猜你喜欢

转载自blog.csdn.net/qq_45859188/article/details/108041708