T1. 奇偶数的判定
内存限制: 256 Mb时间限制: 1000 ms
题目描述
给定一个整数 n,若 n 是一个偶数,输出 even,若 n 是一个奇数,输出 odd。
输入格式
单个整数:表示 n。
输出格式
单个字符串:表示 n 的奇偶性
数据范围
−1,000,000≤n≤1,000,000
样例数据
输入:
0
输出:
even
输入:
-1
输出:
odd
试题解析:简单的基础条件分支题。判断一下n%2是否等零即可。
#include
using namespace std;
int main()
{
int n;
cin>>n;
if(n%2==0)cout<<"even";
else cout<<"odd";
return 0;
}
T2. 搭积木
内存限制: 256 Mb时间限制: 1000 ms
题目描述
小爱同学想要用积木搭起一个金字塔。为了结构稳定,金字塔的每一层要比上一层多一块积木。即搭建规则如下:
金字塔的第 1 层需要放 1 块积木
金字塔的第 2 层需要放 2 块积木
金字塔的第 3 层需要放 3 块积木
…
金字塔的第 i 层需要放 i 块积木
现在小爱拿到了 n 块积木,请问他最高可以搭出多少层的金字塔?
输入格式
输入一个正整数 n,表示小爱手中的积木数量
输出格式
输出一个正整数,表示小爱最高能搭的金字塔层数
数据范围
对于 50% 的数据,1≤n≤1,000
对于 100% 的数据,1≤n≤1,000,000,000
样例数据
输入:
12
输出:
4
说明:
4层金字塔需要1+2+3+4=10块积木,而5层金字塔需要1+2+3+4+5=15块积木,所以小爱在有12块积木的情况下,最多搭4层金字塔
试题解析:
其实就是:s=1+2+3+...
当s>n时停止循环。
s所加的最后一项的前一项即是答案。
注意:
i++在s+=i之前,答案为:i-1。
i++在s+=i之后,答案为:i-2。
#include
using namespace std;
int main()
{
int n,s,i;
cin>>n;
s=0;
for(i=1;s<=n;i++)s+=i;
cout<
T3. 最长平台
内存限制: 256 Mb时间限制: 1000 ms
题目描述
给定一个整数数列 a1,a2,...,an ,请找出最长平台,并输出最长平台的数量(数字相等但位置不同的平台算作不同的平台)。
所谓平台,就是指数列中一段连续的、完全相等的数字,单个数字可以成为一个平台。
输入格式
第一行:单个整数 n
第二行:n 个整数 a1,a2,...,an
输出格式
两个整数:表示最长平台的长度与最长平台的数量
数据范围
对于 50% 的数据,n≤1000
对于 100% 的数据,n≤500,000
1≤ai≤1,000,000
样例数据
输入:
7
2 2 2 1 3 3 3
输出:
3 2
说明:
最长平台为2 2 2或3 3 3
输入:
5
3 1 4 1 5
输出:
1 5
说明:
每个数字单独成一个平台
试题解析:模拟题
1. 第一轮循环从前向后统计出每个平台的长度,并将每个平台长度其存入b数组,同时储存最大平台长度。要注意,最后一个平台的有没有被遗漏。
2. 循环一轮b数组,统计一下和最长平台相等的平台数量有几个。
#include
using namespace std;
int a[500005];
int b[500005],k;
int main()
{
int n,t,maxn=1,tj=0;
cin>>n>>a[1];
t=1;
for(int i=2;i<=n;i++){
cin>>a[i];
if (a[i]==a[i-1]){
t++;
if(t>maxn)maxn=t;
}
else{
b[k++]=t;
t=1;
}
}
b[k++]=t;
cout<
T4. 积木染色
内存限制: 256 Mb时间限制: 1000 ms
题目描述
有 n 块积木排成一排,小爱需要给每块积木染色,颜色有 mm 种,请问有多少种方法,能使相邻两块积木的颜色均不相同?
输入格式
输入两个正整数n,m
输出格式
输出满足条件的方案数模10^9+7的结果
数据范围
对于 30% 的数据,1≤n,m≤10
对于 60% 的数据,1≤n,m≤10^4
对于 100% 的数据,1≤n≤10^15 ,1≤m≤10^9
样例数据
输入:
3 2
输出:
2
说明:
合法的染色方案有:{1,2,1} {2,1,2}
试题解析:求排列数(乘法原理)
第1个积木有m种选择,第2至第n个积木都有(m-1)种选择,所以计算公式为:
m*(m-1)^(n-1)
解决方案1:用(n-1)轮循环,每次循环乘以(m-1),能拿到60分。
解决方案2:用快速幂计算(m-1)^(n-1),能拿到100分。
注意:数据量比较大用long long ,为保证乘法运算不超long long 每次运算完即做取模。
#include
using namespace std;
const int M=1e9+7;
long long n,m;
int main()
{
cin>>n>>m;
long long t=m-1,mm=n-1,ans=1;
while(mm){
if(mm&1) ans=ans*t%M;
t=t*t%M;
mm>>=1;
}
ans=ans*m%M;
cout<
T5. 出栈序列
内存限制: 256 Mb时间限制: 1000 ms
题目描述
给定一个长度为n的、仅由小写字母组成的字符串,将其按序依次放入栈中。
请问在所有可能的出栈序列中,字典序最小的出栈序列是多少?
输入格式
输入第一行, 一个正整数n
输入第二行,一个长度为n的字符串
输出格式
输出所有出栈序列中,字典序最小的出栈序列
数据范围
对于30%的数据,1≤n≤10
对于60%的数据,1≤n≤10^3
对于100%的数据,1≤n≤10^5
样例数据
输入:
3
yes
输出:
esy
说明:
字符y、e、s依次进栈,所有出栈的可能性有:
{yes}、{yse}、{eys}、{esy}、{sey}
其中 {esy} 的字典序最小
试题解析:栈的基本操作
1.逆向循环初始化num[i]来储存i~len-1之间的最小值,作为比对对象。
2.将该字符串的每一个字符依次入栈,在入栈之前如果栈非空比较栈顶元素,如果栈顶元素不小于当下num[i],出栈,直到栈顶大于当下字符。
3.注意,不要忘了站内剩余元素依次出栈。
#include
using namespace std;
const int N=1e5+10;
int num[N],n;
string s;
int main()
{
stack v;
string st="";
cin>>n>>s;
int ls=s.size();
num[ls-1]=s[ls-1]-'a';
for (int i=ls-2;i>=0;i--)//num[i]储存[i,ls-1]之间的最小值
num[i]=min(s[i]-'a',num[i+1]);
for(int i=0;i<=ls-1;i++){
//v非空 且 栈顶元素小于等于num[i]时 出栈
while(!v.empty() && num[i]>=(v.top()-'a')){
st+=v.top();
v.pop();
}
v.push(s[i]);//入栈
}
while(!v.empty()){//栈中如果还有剩余 依次出栈
st+=v.top();v.pop();
}
cout<