牛客练习赛67水题

Powered by:AB_IN 局外人

A 牛牛爱字符串

用的 P y t h o n Python Python做的,可能因为 P y t h o n Python 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 ≤ a , b a\&b \leq a,b a&ba,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) a1&a2&.....&aka1,a2,.....,akmax(a1,a2,.....,ak)
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 dp过去就行了。
d p [ i ] [ 0 / 1 ] dp[i][0/1] dp[i][0/1],表示在 i i i这个位置之前的数全为 0 / 1 0/1 0/1

  • a [ i ] = 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) dp[i][1]=min(dp[i1][1],dp[i1][0]+1)
      • d p [ i ] [ 1 ] dp[i][1] dp[i][1] 相当于 1111111 1111111 1111111(设 i = 7 i=7 i=7)
      • d p [ i − 1 ] [ 1 ] dp[i-1][1] dp[i1][1] 相当于 111111 111111 111111,这时候直接加上 a [ i ] a[i] a[i]就行了,值不变。
      • d p [ i ] [ 0 ] dp[i][0] dp[i][0] 相当于 000000 000000 000000, 加上 a [ i ] a[i] a[i]变成 0000001 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) dp[i][0]=min(dp[i1][1]+1,dp[i1][0]+1)
      • d p [ i ] [ 0 ] dp[i][0] dp[i][0] 相当于 0000000 0000000 0000000(设 i = 7 i=7 i=7)
      • d p [ i − 1 ] [ 1 ] dp[i-1][1] dp[i1][1] 相当于 111111 111111 111111,加上 a [ i ] a[i] a[i]变成 1111111 1111111 1111111,要都变成 0 0 0,需要一次前缀修改
      • d p [ i ] [ 0 ] dp[i][0] dp[i][0] 相当于 000000 000000 000000, 加上 a [ i ] a[i] a[i]变成 0000001 0000001 0000001,要都变成 0 0 0,则需要单点修改
  • a [ i ] = 0 a[i]=0 a[i]=0
    • 同理
#include
#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;
}

完结。

你可能感兴趣的:(ACM)