牛客 —— 3 th

传送门


A. Clam and Fish

题意

小月有 (n) 单位的时间都在钓鱼,每个单位时间有四种状态,有蛤蜊/没蛤蜊 , 有鱼/没鱼。小月事先知道这 (n) 个时间点的状态。每个时间点有四种可能的动作:

  • 若该时间点有鱼,则可以直接钓鱼。
  • 若该时间点有蛤蜊,则可以用该蛤蛎制作一个鱼饵。
  • 若该时间点身上有至少一个鱼饵,则可以用一个鱼饵钓一条鱼,钓完后就少 了一个鱼饵。
  • 什么事都不做。

请问小月最多可以钓多少条鱼。

数据范围

(1leq t leq 2.5 imes 10^{5})
(1leq n leq 2 imes 10^{6})

题解

只需要考虑什么都没有的和有蛤蜊的数量,其他的直接钓鱼即可
如果当前第0类和第1类匹配后还剩下(x)个第1类,那么这(x)个第一类中就可以一个生产鱼饵一个钓鱼

Code

cpp
#include<bits/stdc++.h>
using namespace std;
#define rep(i,a,n) for(int i=a;i<n;i++)
#define per(i,a,n) for(int i=n-1;i>=a;i--)
#define fi first
#define se second 
#define ll long long
#define pb push_back
typedef pair<long long,long long> pll;
typedef pair<int,int> pii;
typedef vector<int> vi;
typedef vector<long long> vll;
typedef double db;
const ll mod=1e9+7;
ll powmod(ll a,ll b,ll p){ll res=1;a%=p;while(b){if(b&1) res=res*a%p;a=a*a%p;b>>=1;}return res;}
ll gcd(ll a,ll b) {return b?gcd(b,a%b):a;}
int _;
const int N = 2e6+10;
int sum;
int n;
char s[N];
int pe[N];
int main(){
    for(scanf("%d",&_);_;_--){
        sum=0;
        scanf("%d",&n);
        scanf("%s",s+1);
        int ans=0;
        rep(i,1,n+1){
            if(s[i] == '0') {
                if(sum) { ans++;sum--;}
            }
            else if(s[i] == '1'){
                sum++;
            } 
            else if(s[i] == '2') ans++;
            else ans++;
        }
        ans+=sum/2;
        
        printf("%d
",ans);
    }
}


B. Classical String Problem

题意

有一个字符串,有两种操作:

  • 询问第 x 个字符。
  • 把最左边的 x 个字符搬到最右边或把最右边 x 个字符搬到最左边。

每次询问输出当前位置的字符

数据范围

(2leq |S|leq 2 imes 10^{6})
(1leq Qleq 8 imes 10^{5})

题解

初始时指针在 n 的前面 |nowcoder
• 操作 1 询问指针右边第 1 个字符,答案是 n
• 操作 2 把 4 个字符搬到右边,相当于把指针向右移 4 个字符 nowc|oder
• 操作 3 询问指针右边第 6 个字符,答案是 o
• 操作 4 把右边 3 个字符搬到右边,相当于把指针向左移 3 个字符 n|owcoder

Code

cpp
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define pb push_back
#define rep(i,a,n) for(int i=a;i<n;i++)
const int N=2e6+10;
int _;
char s[N];
int n,q;
int x;
int main(){
    scanf("%s",s+1);
    n=strlen(s+1);
    scanf("%d",&q);
    int st=0;
    while(q--){
        char op[2];
        scanf("%s",op);

        scanf("%d",&x);

        if(*op=='M'){
            st+=x;
            if(x<0) st=(st+n)%n;
        }
        else{
            x+=st;
            if(x%n!=0)
                printf("%c
",s[x%n]);
            else printf("%c
",s[n]);

        }
    }
}

L. Problem L is the Only Lovely Problem

题意

判断一个字符串是否为 lovely 开头,不分大小写。

Code

cpp
#include<bits/stdc++.h>
using namespace std;
#define rep(i,a,n) for(int i=a;i<n;i++)
#define per(i,a,n) for(int i=n-1;i>=a;i--)
#define fi first
#define se second 
#define ll long long
#define pb push_back
typedef pair<long long,long long> pll;
typedef pair<int,int> pii;
typedef vector<int> vi;
typedef vector<long long> vll;
typedef double db;
const ll mod=1e9+7;
ll powmod(ll a,ll b,ll p){ll res=1;a%=p;while(b){if(b&1) res=res*a%p;a=a*a%p;b>>=1;}return res;}
ll gcd(ll a,ll b) {return b?gcd(b,a%b):a;}

int main(){
    string s;
    cin>>s;
    char mat[12]={'l','o','v','e','l','y','L','O','V','E','L','Y'};
    bool ok=1;
    rep(i,0,6){
        if(s[i]==mat[i] || s[i]==mat[i+6]) continue;
        else {
            ok=0;
            break;
        }
    }
    if(ok) puts("lovely");
    else puts("ugly");
}
原文地址:https://www.cnblogs.com/hhyx/p/13337051.html