2020年郑州轻工业大学“卓见杯”网络预选赛

我是皮皮猫吖!

每文一言:我在坚定我的坚定,哪怕只有我坚信。


本篇文章:

由于技术原因,只记录了自己最后学会的题目。(我太菜了,我要练习算法)闲着没事的时候,多刷一点pta,提升自己的算法实践能力。

正文如下:

题目一:到底谁更帅
题目描述:

一般我们对于比较熟的学长都会叫某某哥,那么ACM组就有个帅哥了,但是婷婷不乐意了,婷婷说,明明我才是最帅的,为什么叫他帅哥不叫我帅哥。于是婷婷就向帅哥发起了挑战:比赛起名字!

起名字的规则是:先有婷婷和帅哥两个名字,我们分别用A和B表示他们名字的长度。命名的规则是,新起的名字的长度必须是现有的名字的长度的和或者差,而且不能和现有的名字的长度一样的,还有就是不能超过长度N。

比如现有的名字的长度A和B,那么新起的一个名字的长度就是A+B或者|A-B|,起了之后就有了三个名字的长度了
因为是婷婷发起的挑战,为了表示礼让,让帅哥做先手,谁不能再起名字了,谁就输了。

输入:

首先输入一个N,表示名字的长度最长不能超过N,然后输入两个数字A和B,表示婷婷和帅哥的名字的长度(0<A,B<=N<105)

输出:

如果婷婷赢了,就输出“TingTing said,ha ha,I was the most handsome!”,如果帅哥赢了,就输出“Shuai seniors said,oh yeah,I was the most handsome!”。

样例输入:
10 3 5
20 1 9
3 1 2
10 2 8

样例输出:

TingTing said,ha ha,I was the most handsome!
TingTing said,ha ha,I was the most handsome!
Shuai seniors said,oh yeah,I was the most handsome!
Shuai seniors said,oh yeah,I was the most handsome!
分析:

借鉴某大佬的思路,想到此处的A+B和|A-B|,本质上是直接操作A和B的公约数。

代码如下:
#include <stdio.h>
#include <iostream>

using  namespace std;

//辗转相除法求最大公约数
int getMaxGongYue(int t, int s){
    int yu;
    //两个数中的最大值
    int max = t > s ? t : s;
    //两个数中的最小值
    int min = t < s ? t : s;
    //余数
    yu = max % min;
    //辗转相除法:余数当除数,除数当被除数
    while(yu!=0){
        max = min;
        min = yu;
        yu = max % min;
    }
    return min;
}
int main(){
    int num, t, s;
    int lose;
    while(scanf("%d %d %d", &num, &t, &s)!=EOF){
        //得到最大公约数
        lose =  getMaxGongYue(t, s);
        if((num/lose)%2==0){
            cout << "TingTing said,ha ha,I was the most handsome!"<<endl;
        }else{
            cout << "Shuai seniors said,oh yeah,I was the most handsome!"<<endl;
        }
    }
}
题目二:婷婷是土豪
题目描述:

众所周知婷婷是我们组大土豪,组里找他借钱和还钱的都有一大堆,借钱的太多了,每天晚上他都要抱怨没钱了。
每天早上,找婷婷借钱的都排成一条长队,假设还钱的有m个,借钱的有n个,现在的问题是,这些人有多少种排法,可以避免出现婷婷没有钱可借的尴尬场面。(两个同样需求的人(比如都是还钱或都是借钱)交换位置是同一种排法)

输入:

两个整数,表示m和n.

输出:

一个整数,表示队伍的排法的方案数。

样例输入:
3 2
样例输出:
5
分析:

第一次看到这道题的时候,知道深搜可以做,但是由于技术有限,在参考别人的代码下,知道了如何做出这道题。

代码如下:
#include "bits/stdc++.h"

using namespace std;

int ans = 0;
int m, n;
void dfs(int num_m, int num_n){
    //达到输入的数据的条件的时候,搜索结束
    if(num_m==m && num_n==n){
        ans++;
        return;
    }
	//不满足条件,跳出搜索
    if(num_m<num_n){
        return;
    }

    //还钱搜索
    if(num_m<m){
        dfs(num_m+1, num_n);
    }

    //借钱搜索
    if(num_n<n){
        dfs(num_m, num_n+1);
    }
}

int main(){
    while(scanf("%d %d", &m, &n)!=EOF){
        if(m!=0 || n==0){
            cout<<"1"<<endl;
        }else if(m==0 || n==0 || m < n){
            cout << "0"<<endl;
        }else{
            ans = 0;
            dfs(0, 0);
            cout << ans << endl;
        }
    }
}
题目三:绿绿学姐与AI 1
题目描述:

绿绿学姐对机器学习很感兴趣,她开始研究机器学习算法。
她研究的第一个问题是语义识别,当她花了十分钟完全掌握之后,发现她手上没有训练样本,于是她把这个任务交给了你,如果你出色地完成了她的任务,就可以吸收她的欧气。
绿绿学姐给你的任务是这样的:
她会给你n个词语,其中前a个是正面的词语,剩下的b个是负面的词语,随后给出Q个句子,你需要输出这个句子偏向负面还是正面。
假设一个句子包含x个正面的词语,y个负面的词语,如果x>y,我们就说这个句子偏向正面,如果x<y,我们就说这个句子偏向负面,如果x==y,我们就说这个句子是中性的。

输入:

一个数T,表示数据的组数,1<=T<=50。
每组数据第一行包含三个整数n,a,b,含义如上所述,1<=n<=5000, 1<=a,b<=n,保证a+b==n,。
随后是n行,每行一个词语。
随后一个整数Q,表示Q个句子,1<=Q<=500。
随后Q行,每行一个句子,句子长度不超过1000。
词语长度不超过20,并且只包含小写字母,句子由若干个用一个空格隔开的词语构成。

输出:

对于每一个句子输出一行。
如果句子是偏正面的,输出"positive"。
如果句子是偏负面的,输出"negative"。
如果句子是中性的,输出"neuter"。(输出均不包含引号)

样例输入:
1
5 2 3
happy
glad
sad
sorry
cry
3
you are happy
you are sad
you are student
样例输出:
positive
negative
neuter
分析:

第一次做的时候,使用暴力查找字符串的。这道题是卡时间的,一直是时间超限。换了一种方法:使用map进行查找,然后时间明显缩短了。(以空间换时间)

代码如下:
#include<stdio.h>
#include <stdlib.h>
#include <iostream>
#include <algorithm>
#include <map>

using namespace std;

map<string, int>mp;
void print(){
    mp.clear();
    int n, a, b;
    int sum = 0;
    string s;
    cin >> n >> a >>b;
    while(a--){
        cin>>s;
        mp[s]=1;
    }
    while(b--){
        cin>>s;
        mp[s]=-1;
    }
    cin >> n;
    while(n--){
        sum = 0;
        while(cin >> s){
            sum += mp[s];
            if(getchar()=='\n')
                break;
        }
        if(sum>0)
            cout << "positive" << endl;
        else if(sum==0)
            cout << "neuter" << endl;
        else
            cout << "negative" << endl;
    }
}

int main(){
    int n;
    cin >> n;
    while(n--)
      print();
    return 0;
}

能力有限,这是在参考了别人的想法之后,完成上述的题目的。能力不足,继续加油(其他题目,没能想出来)…

作者:皮皮猫吖


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值