2020牛客暑期多校训练营(第三场)

就写一下自己写了的题,也不好意思发去要牛币了

A,Clam and Fish

题意大概就是现在有一个人在捞鱼,河里有四种状态,有鱼有诱饵,有鱼无诱饵,无鱼有诱饵,无鱼无诱饵,四种状态每次可以操作一次在有鱼的状态下可以拿鱼,在有诱饵的状态下可以拿诱饵,如果在无鱼但是之前拿了诱饵也可以消耗一个诱饵拿鱼,(只能选择拿鱼或者拿诱饵或者什么都不做三个中的一个),现在给你一个序列由0123组成分别表示四个状态,问你能拿到最多的鱼数量,

既然要拿鱼最多那么我们在有鱼的时候就选择拿鱼,毕竟拿了诱饵还要下一次才能换成鱼,所以在有鱼的状态下肯定是拿鱼,那么我们要考虑的就是在01(0表示两个都没有,1表示有诱饵)两种的时候贪心,这里考虑到一个问题,拿了诱饵要能用出去,我的想法就是直接倒过来,用一个cnt表示现在的空地数(表示能用诱饵的地方),遇到一个1就看看cnt是否大于0,大于0就选择拿诱饵,这样就可以空地数减一,即cnt--,sum++,

代码

#include <cctype>
#include <cfloat>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <algorithm>
#include <deque>
#include <fstream>
#include <functional>
#include <iomanip>
#include <iostream>
#include <istream>
#include <iterator>
#include <list>
#include <map>
#include <ostream>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <string>
#include <utility>
#include <vector>
#include <unordered_map>
#include <unordered_set>
#define ll long long
using namespace std;
const ll MAXN=2e6+10;
char s[MAXN];
int main(void){
    int T;
    scanf("%d",&T);
    while(T--){
        int n;
        int sum=0;
        int cnt=0;
        scanf("%d",&n);
        scanf("%s",s);
        for(int i=n-1;i>=0;--i){
            if(s[i]=='2'||s[i]=='3')
                sum++;
            else{
                if(cnt==0&&s[i]=='1'||s[i]=='0')
                    cnt++;
                else if(cnt!=0)
                    sum++,cnt--;
            }
        }
        printf("%d\n",sum);
    }
    return 0;
}

B,Classical String Problem

这个题目的意思很简单,给出一个字符串,然后给两个操作A b表示输出第b个数字,M b表示移动字符,如果b是正数,比如2表示把最左边的两个字母移到最右边,如果是负数,比如-2就是将最右边的两个字母移到最左边。

本来一开始我是直接构建字符串,每移到一次就构建一个新的字符串代替原来的,但是超时了。。。。所以我们只能考虑指针的移动,这里的指针移动和循环队列很相似可以把他看成一个循环队列来做,设置一个头指针,本来我还设立尾指针,但是其实用不到,因为这里没有加减字符串的操作,这个题目其实我也是一边写代码一边才看懂这个指针怎么移动的,用题目中的样例nowcoder,我们执行M 2,就得到wcoderno是不是就像是头指针向左移了两个单位,现在头指针指向-2+8=6,然后我们按照6为头指针向右边走是不是还是原来那个字符串,这样一看是不是就理解了,同理-2就是头指针右移两个单位,现在只要对指针好好处理就没事了。

说实话这个题目我一开始不知道要怎么给字符串多组输入,一开始我用的是string类,我只知道用while(cin>>s)然后就超时,主要是一开始总不记得要吸收回车,导致后面读入AB的时候出现问题,然后就是牛客上面不用多组也行。。。。。

#include <cctype>
#include <cfloat>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <algorithm>
#include <deque>
#include <fstream>
#include <functional>
#include <iomanip>
#include <iostream>
#include <istream>
#include <iterator>
#include <list>
#include <map>
#include <ostream>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <string>
#include <utility>
#include <vector>
#include <unordered_map>
#include <unordered_set>
#define ll long long
using namespace std;
const ll MAXN=2e6+5;
char s[MAXN];
int main(void){
    scanf("%s", s);
    int n,b,len = strlen(s);
    char a;
    int front=0,rear=len-1;
    scanf("%d",&n);
    while(n--){
        getchar();
        scanf("%c%d",&a,&b);
        if(a=='A'){
            if(front+b-1>=len){
                printf("%c\n",s[front+b-1-len]);
             }
             else{
                printf("%c\n",s[front+b-1]);
            }
        }
        else{
            if(b>0){
                front+=b;
                if(front>=len){
                    front-=len;
                }
            }
            else{
                front+=b;
                if(front<0){
                    front+=len;
                }
            }

        }
    }
    return 0;
}

L,Problem L is the Only Lovely Problem

这个题目是签到题,就是输入一串字符,如果这串字符的开头是lovely就输出lovely,否则输出ugly,这个题目唯一的难点就是判断开头是否为lovely不区分大小写,所以我们把开头那一段全部化成大写或者小写就可以了,这个题目用py很容易,因为有直接转换的函数,但是我还没学到那里,所以我还是用c++手写了一个转换的,因为只需要比较开头,所以我用一个新的字符串装下原来的那个字符串开头的6个字符再全部转化为小写,虽然繁杂了一点但是节约了一点运行时间

代码

#include <cctype>
#include <cfloat>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <algorithm>
#include <deque>
#include <fstream>
#include <functional>
#include <iomanip>
#include <iostream>
#include <istream>
#include <iterator>
#include <list>
#include <map>
#include <ostream>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <string>
#include <utility>
#include <vector>
#include <unordered_map>
#include <unordered_set>
#define ll long long
using namespace std;
int main(void){
    string a1="lovely";
    string n,n1;
    while(cin>>n){
        n1.assign(n, 0, 6);
        for(int i=0;i<n1.length();++i){
            if(n1[i]<='Z')
                n1[i]+=32;
        }
        if(n1==a1)
            cout<<"lovely"<<endl;
        else{
            cout<<"ugly"<<endl;
        }

    }
}
全部评论

相关推荐

听说改名字就能收到offer哈:Radis写错了兄弟
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务