牛客 —— 3 th
传送门
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 个字符搬到最左边。
每次询问输出当前位置的字符
数据范围
\(2\leq |S|\leq 2\times 10^{6}\)
\(1\leq Q\leq 8\times 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\n",s[x%n]);
else printf("%c\n",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");
}