牛客网小白月赛 7

比赛链接:https://www.nowcoder.com/acm/contest/190#question

A 送分题
链接:https://www.nowcoder.com/acm/contest/190/A
来源:牛客网

题目描述
做水题就是在浪费时间,但是一场比赛要是没有送分的签到题,大家的比赛体验就会很差。为了优化你的比赛体验又不浪费你的读题时间,我并不打算给你很复杂的故事背景,你只需要复制下面的代码并选择正确的语言提交即可通过此题。

long long f(long long n)
{
if (n < 20180001) return n + 2017;
return f(f(n - 2018));
}
int main()
{
long long n;
cin >> n;
cout << f(n) << endl;
return 0;
}
还以为真的是copy,仔细看一下程序了解到大于等于20180001的数都是20182017,所以优化一下就好了

#include<iostream>
using namespace std;
long long f(long long n)
{
    if (n < 20180001) return n + 2017;
    else{
        return 20182017;
    }
}
int main()
{
    long long n;
    cin >> n;
    cout << f(n) << endl;
    return 0;
}

B 自杀游戏
链接:https://www.nowcoder.com/acm/contest/190/B
来源:牛客网

题目描述
Alice和Bob产生了不可调节的矛盾,于是他们相约一起玩一个自杀游戏,输的人就会从这个世界上消失。

游戏开始时,Alice手上拿着一个定时炸弹,炸弹有个倒计时t。炸弹在t=0时刻会爆炸,此时手上拿着炸弹的人会从这个世界上消失。为了增加游戏乐趣,他们约定每个人拿到炸弹后可以选择将炸弹的时间调快d秒(d ∈ [a,b]),或者不调。每次交换炸弹会消耗1秒(假设调节炸弹时间不需要消耗时间)。

问题来了,如果双方都足够聪明,谁会活下去呢?
输入描述:
第一行有三个整数t,a,b,分别表示炸弹初始时刻的倒计时,可调节时间的范围。(0 ≤ t ≤ 105,1 ≤ a ≤ b ≤ 10)
输出描述:
若Alice存活则输出”Alice”,若Bob存活则输出”Bob”。

博弈论问题,递推,开状态数组,state[i]表示先手能否能赢,而state[i]由state[i-1] ,state[i-a-1]至state[i-b-1]之间的数转移,只要这些数里面有0,state[i]就是1 一个必败态的后继状态全部是必胜态,一个必胜态的后继存在必败态

#include<bits/stdc++.h>
using namespace std;
int state[100000+100];
int main(){
    int t,a,b;
    cin>>t>>a>>b;
    for(int i=1;i<=t;i++){
       if(state[i-1]==0){
           state[i]=1;
        }
        for(int j=a+1;j<=b+1;j++){
            if(i-j>=0&&state[i-j]==0){
                state[i]=1;
             }
        }
    }
    printf("%s\n",state[t] ? "Alice":"Bob");


    return 0;
}

C 谁是神射手
链接:https://www.nowcoder.com/acm/contest/190/C
来源:牛客网

题目描述
有一天,MWH突然来了兴致,想和CSL比比谁枪法好。于是他们找来了一个瓶子,比比看谁先打中这个瓶子。 给定MWH的命中率和CSL的命中率。 两人轮流射击,MWH先手,问谁获胜的概率大?
输入描述:
输入两个整数和,表示MWH和CSL的命中率。.
输出描述:
若MWH获胜的概率大,则输出”MWH”。 若CSL获胜的概率大,则输出”CSL”,否则输出”equal”。

这里写图片描述
公式换算相信大家都知道是等比数列求和

#include<bits/stdc++.h>
using namespace std;
int main(){
    double a,b;
    cin>>a>>b;
   if(a>(100-a)*b/100){
    printf("MWH\n");
    }
    else if(a<(100-a)*b/100){
    printf("CSL\n");
    }
    else{
     printf("equal\n");
    }
    return 0;
}

E Applese的超能力
链接:https://www.nowcoder.com/acm/contest/190/E
来源:牛客网

题目描述
Applese有个神奇的能力,TA可以把m个硬币融合成1个硬币,是不是很厉害。现在Applese有n个硬币,TA想把这个n个硬币融合成1个,请问他能完成吗?
输入描述:
输入两个整数n,m(1 ≤ n, m ≤ 109)
输出描述:
如果Applese能完成,输出”Yes”,否则输出”No”。

细节题:
具体看代码就行

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int banduan(int a,int b){
    int flag=0;

    ll sum=a%b+a/b;

    while(sum>=b){
        sum=sum%b+sum/b;
    }
    if(sum==1){
        flag=1;
    }
    else if(sum<b){
        flag=0;
    }
    return flag;
}

int main(){
    int n,m;
    scanf("%d %d",&n,&m);
    if(m==1&&n!=1){
        printf("No\n");
    }
    else if(n==1){
        printf("Yes\n");
    }
    else{
        if(banduan(n,m)){
            printf("Yes\n");
        }
        else{
            printf("No\n");
        }
    }
    return 0;
}

正解代码更简单,这里(n-1)mod(m-1)解释一下。最后要留一个数出来,每次合成都会减少(m-1)个,所以

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;


int main(){
    int n,m;
    scanf("%d %d",&n,&m);
    if(m==1&&n!=1){
        printf("No\n");
    }
    else if(n==1){
        printf("Yes\n");
    }
    else{
        if((n-1)%(m-1)==0){
            printf("Yes\n");
        }
        else{
            printf("No\n");
        }
    }
    return 0;
}

剩余的先占个坑,嗯,就是这样

F BFS
链接:https://www.nowcoder.com/acm/contest/190/F
来源:牛客网

题目描述
Bob在学习了DFS后,自己又发明了一种新的搜(luan)索(gao)方法,叫做BFS(Bobby First Search)。

这种搜索被定义为:在一个字符串中,从前向后查找第一个子串”Bob”出现的位置。(不区分大小写)

输入描述:
输入一个不含空格的字符串S(可能含有大小写字母,数字)。(1 ≤ |S| ≤ 100)
输出描述:
输出一个数字,表示”Bob”第一次出现的位置(下标从0开始)。

如果没有出现,则输出”-1”。

其实用std:string :find 暴力匹配就可以解决,但是我是直接套的kmp

#include<bits/stdc++.h>
using namespace std;

std::map<int,int> compute_prefix(const std::string &pattern)
{
    int i = 1;
    int p = 0;
    std::map<int, int> pi;
    int length = pattern.length();
    pi.insert(std::make_pair(1, 0));
    while (i < length)
    {
        if (p > 0 && pattern[i] != pattern[p])
        {
            p = 0;
        }
        if (pattern[i] == pattern[p])
        {
            ++p;
        }
        pi.insert(std::make_pair(i + 1, p));
        i++;
    }
    return pi;
}

int kmp_match(const std::string &text,const std::string &pattern)
{
    std::map<int, int> pos;
    pos = compute_prefix(pattern);
    int q = 0;
    for (int i = 0; i < text.length(); i++)
    {
        if (q > 0 && text[i] != pattern[q])
        {
            q = pos.at(q);
        }
        if (text[i] == pattern[q])
        {
            q++;
        }
        if (q == pattern.length())
        {
            return (i+1)-q+1;
        }
    }
    return 0;
}

int main(){
    string str;
    cin>>str;
    int flag=0;
    bool flag1=false;

    if(kmp_match(str,"bob")){
        flag=kmp_match(str,"bob")-1;
        flag1=true;
    }
    if(kmp_match(str,"Bob")){
        if(flag>kmp_match(str,"Bob")-1){
            flag=kmp_match(str,"Bob")-1;
        }
            flag1=true;
    }
    if(kmp_match(str,"bOb")){

            if(flag>kmp_match(str,"bOb")-1){
                  flag=kmp_match(str,"bOb")-1;
            }
            flag1=true;
    }
    if(kmp_match(str,"boB")){

        if(flag>kmp_match(str,"boB")-1){
                  flag=kmp_match(str,"boB")-1;
            }
                flag1=true;
    }
    if(kmp_match(str,"BOb")){

            if(flag>kmp_match(str,"BOb")-1){
                  flag=kmp_match(str,"BOb")-1;
            }
                flag1=true;
    }
    if(kmp_match(str,"BoB")){

        if(flag>kmp_match(str,"BoB")-1){
                  flag=kmp_match(str,"BoB")-1;
            }
                flag1=true;
    }
    if(kmp_match(str,"bOB")){

        if(flag>kmp_match(str,"bOB")-1){
                  flag=kmp_match(str,"bOB")-1;
            }
                flag1=true;
    }
    if(kmp_match(str,"BOB")){

        if(flag>kmp_match(str,"BOB")-1){
                  flag=kmp_match(str,"BOB")-1;
            }
                flag1=true;
    }

    if(flag1){
        printf("%d\n",flag);
    }
    else{
        printf("-1\n");
    }
    //printf("%d\n",kmp_match(str,"bob"));
    return 0;

}

G CSL分苹果
链接:https://www.nowcoder.com/acm/contest/190/G
来源:牛客网

题目描述
CSL手上有n个苹果,第i个苹果的质量是wi,现在他想把这些苹果分给他的好朋友wavator和tokitsukaze。但是CSL为了不让他们打架,根据质量决定尽量地均分成两堆分给他们。现在CSL想知道到底给每个人分多少质量的苹果。

注意:苹果不能劈开来,并且如果不能正好均分,tokitsukaze小姐姐会拿到重的那一堆。
输入描述:
第一行输入一个整数n(2 ≤ n ≤ 100),第二行n个整数,表示每个苹果的质量wi(1 ≤ wi ≤ 100)。
输出描述:
输出两个整数,分别表示wavator和tokitsukaze得到的苹果的质量。

直接01背包。

#include<bits/stdc++.h>
using namespace std;
const int maxn=10000+10;
int dp[maxn];
int a[maxn];
int main(){
    int n;
    cin>>n;

    int sum,i,j,sum2;
    for(i=0;i<n;i++){
        cin>>a[i];
        sum+=a[i];
    }
    sum2=sum/2;
    for(i=0;i<n;i++){
        for(j=sum2;j>=a[i];j--){
            dp[j]=max(dp[j],dp[j-a[i]]+a[i]);
        }
    }

    printf("%d %d\n",dp[sum2],sum-dp[sum2]);
} 

猜你喜欢

转载自blog.csdn.net/qq_37774171/article/details/82725680