1. 程式人生 > 實用技巧 >牛客多校 —— 第三場

牛客多校 —— 第三場

傳送門

A. Clam and Fish

題意

小月有 \(n\) 單位的時間都在釣魚,每個單位時間有四種狀態,有蛤蜊/沒蛤蜊 , 有魚/沒魚。小月事先知道這 \(n\) 個時間點的狀態。每個時間點有四種可能的動作:

  • 若該時間點有魚,則可以直接釣魚。
  • 若該時間點有蛤蜊,則可以用該蛤蠣製作一個魚餌。
  • 若該時間點身上有至少一個魚餌,則可以用一個魚餌釣一條魚,釣完後就少 了一個魚餌。
  • 什麼事都不做。
    請問小月最多可以釣多少條魚。

資料範圍

\(1\leq t \leq 2.5 \times 10^{5}\)
\(1\leq n \leq 2\times 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\n",ans);
    }
}

B. Classical String Problem

題意

有一個字串,有兩種操作:

  • 詢問第 x 個字元。
  • 把最左邊的 x 個字元搬到最右邊或把最右邊 x 個字元搬到最左邊。
    每次詢問輸出當前位置的字元

資料範圍

題解

Code

cpp ```cpp
</details>