河南理工大学18级算法协会招新赛(第二场)

传送门:河南理工大学18级算法协会招新赛(第二场)

首先先把三道斐波那契给搞了.

1.

斐波那契数列
单点时限: 2.0 sec

内存限制: 512 MB

请输出斐波那契的第n项

输入格式
单组输入
每组输入一个数n。0≤n≤10

输出格式
输出斐波那契数列的第n项

样例
input
0
output
0
input
1
output
1
很简单的一道题了,知道什么事斐波那契数列即可;

#include<iostream>
using namespace std;
typedef long long int ll;
int main()
{
    ll a[11];
    a[0]=0;
    a[1]=1;
    ll n;
    for(int i=2;i<11;i++)
    {
        a[i]=a[i-1]+a[i-2];
    }//先打表
    while(cin >>n)
    {
        cout <<a[n]<<endl;
    }
    return 0;
}
2.

斐波那契(非递归)
单点时限: 2.0 sec

内存限制: 512 MB

请输出斐波那契的第n项

输入格式
多组输入处理到文件结束,每组输入一个数n。1≤n≤10000

输出格式
输出第n个斐波那契数对109+7取模的结果

样例
input
3
4
output
2
3
对上一个问题的升级,这里的斐波那契数列有10000项,但是47项以后已经爆unsigned long long了,所以只能先取模再储存;

#include<bits/stdc++.h>
#include<stdio.h>
using namespace std;
typedef long long int ll;
const int mod=1e9+7;
ll a[10010];
char s[10010];
int main()
{
    map<ll,ll>mapp;
    a[0]=0;
    a[1]=1;
    for(int i=2;i<=10000;i++)
    {
        a[i]=(a[i-1]+a[i-2])%mod;
    }
    ll n;
    while(cin >>n)
    {
        cout <<a[n]<<endl;
    }
    return 0;
}
3.

超级简单的斐波那契数列
单点时限: 1.0 sec

内存限制: 256 MB

众所周知,斐波那契数列又称黄金分割数列,由数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入

斐波那契的通项公式为:
F(x)=⎧⎩⎨0 (x=0)1 (x=1)F(x−1)+F(x−2) (x>1)

计算斐波那契的第n项是一件容易的事,但是如果给出第n项的斐波那契数num,你能反推出n吗?

试一试吧!

输入格式
第一行一个整数T (0≤T≤100),表示测试组数。
之后的T行,每行一个斐波那契数num (num≠0,1)

输出格式
对于每个测试数据,输出一行表示数num是斐波那契数列的第几项

样例
input
2
2
5
output
3
5

提示(非常重要)

保证num在斐波那契数列的前200000项中

结合前两题的技巧除了要先取模打表,还要用到一个技巧大数取模;传送门;大数取模

#include<bits/stdc++.h>
#include<stdio.h>
using namespace std;
typedef long long int ll;
const int mod=1e9+7;
ll a[200010];
char s[200010];
int main()
{
    map<ll,ll>mapp;
    a[0]=0;
    a[1]=1;
    for(int i=2;i<=200001;i++)
    {
        a[i]=(a[i-1]+a[i-2])%mod;
        mapp[a[i]]=i;
    }
    ll n;
    while(cin >>n)
    {
        while(n--)
        {
            cin >>s;
            ll len=strlen(s);
            ll num=0;
            for(int i=0;i<len;i++)
            {
                num=num*10+s[i]-'0';
                num%=mod;
            }
            cout <<mapp[num]<<endl;
        }
    }
    return 0;
}

这是三月份招新赛中的三道关于斐波那契数列的题,当时就写出来第一道最简单的,唉 自己太菜了…接下来其他题解

4.
打麻将

单点时限: 2.0 sec

内存限制: 512 MB

打麻将实在是太有趣了,不知道大家过年的时候有没有打麻将呢?

我是十分喜欢打麻将的,但是因为我不够聪明,所以我经常会诈胡(不具备胡牌的条件而胡牌),因此我希望你能帮我判断一下我当前的手牌是否符合胡牌的条件。

为了简化这个问题,我们规定胡牌的条件如下:

你必须有且仅能有一个对子(即两张相同的牌)。
除了那个对子之外,其他的都是刻子(3张相同的牌)。(刻子的数量可以为0)
我们用两个字符表示一张麻将:

B,T, W 分别表示牌的种类为 筒子,条子,万子 。(可能你不知道这是什么意思,不过没有关系,你只需要知道这三种类型的牌是互不相同的。)
数字1~9表示牌上的数字。
另外用HZ,FC,BB,EE,WW,SS,NN 来分别表示除了 筒子,条子,万子 以外的 红中,发财,白板,东风,西风,南风,北风 。
对于两种牌来说,只要表示它们的两个字符中第一个字符或第二个字符任意一个不同,那么它们就是不同的牌,每种牌最多只有四张。(例如:B1 和 B2,B1 和 T1,HZ 和 FC 都是不同的。)
输入格式
第一行是一个数字T,表示你需要判断的次数。(1 \leq T \leq 10000)
接下来2*T行,前一行是一个数字 n 是你的手牌数,2≤n≤14,接下来一行有 n 对字符,每一对字符代表你的一张手牌。
保证不会有未知的牌型,不会有任何一种牌出现超过四次,但是你的手牌数因为某种原因可能会是正常出牌不能出现的个数。
输出格式
如果可以胡牌请输出 YES,否则输出 NO 。

样例
input
3
14
B1 B1 B1 T1 T1 T1 W1 W1 W1 HZ HZ HZ WW WW
2
BB BB
7
BB BB B1 B1 B1 B2 B2
output
YES
YES
NO
这道题用map容器做起来比较方便一点。所以需要补一些c++基础容器之map的知识
另外对于输入的字符串可以用c++中的string比较方便;

#include <bits/stdc++.h>

using namespace std;
const int mod=1e9+7;
typedef long long int ll;
string s[15];
int sizee,num;
int main()
{
    int T;
    cin >>T;
    map<string,int>ma;
    while(T--)
    {
        ma.clear();
        num,sizee=0;
        int n;
        cin >>n;
        for(int i=0;i<n;i++)
        {
            cin >>s[i];
            ma[s[i]]++;
        }
        map<string,int>::iterator it;
        for(it=ma.begin();it!=ma.end();it++)
        {
            if(it->second==1||it->second==4)
            {
                sizee=2;
                break;
            }
            if(it->second==2)
                sizee++;
        }
        if(sizee!=1)
            cout <<"NO"<<endl;
        else cout <<"YES"<<endl;
    }
    return 0;
}

5.
字符串博弈

单点时限: 2.0 sec

内存限制: 512 MB

一天Codancer和Todest玩游戏。现在有一个由大写字母组成的字符串s,Codancer和Todest轮流进行一下操作:
如果存在i使得s[i]=s[i+1],就可以把这两个字符从s中删除。比如原本s为ABBA,现在可以把BB删除,此时s就变为AA。
如果一方不能再执行此操作时,该方即为败者。现在Codancer先手,判断Codancer能否获胜。

输入格式
单组输入
输入字符串s。1≤|s|≤10000

输出格式
如果Codancer能够获胜输出”YES”,否则输出”NO”。(不加引号)。

样例
input
ABBA
output
NO
需要用到c++里面的栈功能,运用栈把字符串放在里面,遇到下一个字符和上一个重复的就消去,并且把次数cot加一,结束时判断cot的奇偶性来判断谁赢。

#include <bits/stdc++.h>
#include <stack>
using namespace std;
const int mod=1e9+7;
char s[10005];
int cot;
int main()
{
    stack<char>a;
    cin >>s;
    cot=0;
    a.push(s[0]);
    for(int i=1;i<strlen(s);i++)
    {
        if(a.top()==s[i])
        {
            a.pop();
            cot ++;
        }
        else{a.push(s[i]);}
    }
    if(cot%2==0)
        cout <<"NO"<<endl;
    else cout <<"YES"<<endl;
    return 0;
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值