(首先先把三道斐波那契给搞了.)
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;
}