1、
给出一个含有n个数字的序列a1,a2,a3,...an,可以进行以下操作:
一次操作定义为对这个序列的每个数字进行以下两种改变之一:
1.ai ÷ 2
2.ai × 3
每一次的操作中,必须保证至少有一个数字是第1种改变;并且经过每次操作后,每一个数字都必须是整数。
牛牛得知,每进行一次操作,他就可以得到一颗西瓜糖,但是由于孱弱的数学功底,他不知道何时该对某一个数字进行第一种还是第二种改变,这使得他十分纠结,于是他找来了睿智的你,希望你帮他计算出,他最多可以得到多少颗西瓜糖。
输入描述:
第一行:一个整数n,表示序列中数字的个数,1 <= n <= 10000;
第二行:n个数字,每个数字ai满足1 <= ai <= 109。
输出描述:
一个整数,表示最多可以得到的西瓜糖的颗数。
输入例子1:
2 1 4
输出例子1:
2
输入例子2:
4 3 3 5 9
输出例子2:
0
#include
using namespace std;
int last(int x){
int z = 0;
while(x%2==0){
x/=2;
z++;
}
return z;
}
int main(){
int a, n, r = 0;
cin >> n;
for(int i=0;i> a;
r += last(a);
}
cout<
2、
牛牛很喜欢对数字进行比较,但是对于3 > 2这种非常睿智的比较不感兴趣。上了高中之后,学习了数字的幂,他十分喜欢这种数字表示方法,比如xy。
由此,他想出了一种十分奇妙的数字比较方法,给出两个数字x和y,请你比较xy和yx的大小,如果前者大于后者,输出">",小于则输出"<",等于则输出"="。
输入描述:
两个数字x和y。
满足1 <= x,y <= 109
输出描述:
一个字符,">","<"或者"="。
输入例子1:
2 2
输出例子1:
=
输入例子2:
2 4
输出例子2:
=
#include
#include
using namespace std;
int main()
{
int x,y;
cin>>x>>y;
if(x*log(y)>y*log(x))
{
cout<<"<"<"<
4、
有一个长度为N的序列。一开始,这个序列是1, 2, 3,... n - 1, n的一个排列。
对这个序列,可以进行如下的操作:
每次选择序列中k个连续的数字,然后用这k个数字中最小的数字替换这k个数字中的每个数字。
我们希望进行了若干次操作后,序列中的每个数字都相等。请你找出需要操作的最少次数。
输入描述:
第一行:两个数字n, k,含义如题,满足2 <= k <= n <= 105;
第二行:n个数字,是1, 2, 3,...n的一个排列。
输出描述:
一个整数,表示最少的次数。
输入例子1:
2 2 2 1
输出例子1:
1
输入例子2:
4 3 1 2 3 4
输出例子2:
2
#include
#include
using namespace std;
int main()
{
int n,k,count=0;
int a[2000];
cin>>n>>k;
for(int i=0;i>a[i];
}
while(n>k)
{
n=n-k+1;
count++;
}
cout<
5、
牛牛很喜欢玩接龙游戏,一天他突发奇想,发明了一种叫做“字符串链”的游戏。 这个游戏的规则是这样的,给出3个字符串A,B,C,如果它们满足以下两个条件,那么就可以构成一个“字符串链”:
1.A的最后一个字母和B的第一个字母相同;
2.B的最后一个字母和C的第一个字母相同。
现在牛牛给出了3个字符串A,B,C,希望你能判断这3个字符串能否构成一个“字符串链”,若能则输出“YES”,否则输出“NO”。
输入描述:
一行,3个字符串,每两个字符串之间用一个空格分隔。 1.A,B,C均由小写的英文字母组成; 2.1≤|A|,|B|,|C|≤10,|A|,|B|,|C|分别表示A,B和C的长度。
输出描述:
"YES"或者"NO"(不带引号)。
输入例子1:
b bb b
输出例子1:
YES
输入例子2:
a b c
输出例子2:
NO
#include
#include
using namespace std;
int main()
{
string A,B,C;
cin>>A>>B>>C;
if(A[A.length()-1]==B[0] && B[B.length()-1]==C[0])
{
cout<<"YES"<
3、
一般的括号匹配问题是这样的:
给出一个字符串,判断这个括号匹配是不是合法的括号匹配。
如"((" 和 "())"都不是合法的括号匹配,但是"()()()","(()())()"等就是合法的括号匹配。
这个问题解决起来非常简单,相信大家都知道怎么解决。
现在给出一个加强版的括号匹配问题: 给出n个由括号 '(' 和 ‘)’ 组成的字符串,请计算出这些字符串中有多少对字符串满足si + sj是合法的括号匹配。如果si + sj和sj + si都是合法的括号匹配(i ≠ j),那么这两种搭配都需要计入答案;如果对于si,si + si是合法的括号匹配,那么也需要计入答案。
输入描述:
第一行是一个整数n,表示字符串的个数;
接下来n行是n个非空字符串,全部由'('和')'组成。
1 <= n <= 3 * 105,字符串的长度之和不超过3 * 105。
输出描述:
一个整数,表示满足条件的字符串对的数量。
输入例子1:
3 () ( )
输出例子1:
2
输入例子2:
5 (() ))))) ()()() ((( ))
输出例子2:
1
一、暴力计算,时间超时
#include
#include
#include
#include
using namespace std;
bool isHW(string s)
{
int i;
stack cc;
for(i=0;i v;
cin>>n;
while(n>0)
{
string tem;
cin>>tem;
if(isHW(tem)==true)
{
num++;
}
else
v.push_back(tem);
n--;
}
for(int i=0;i
二、分开讨论,链接:https://www.nowcoder.com/questionTerminal/98d6fa0bd6184b03a503febcee1b1082
来源:牛客网
链接:https://www.nowcoder.com/questionTerminal/98d6fa0bd6184b03a503febcee1b1082
来源:牛客网
#include
#include
#include
using namespace std;
string clean(string s){
while(s.find("()")!=-1)
s.erase(s.find("()"), 2);
return s;
}
int main(){
ios::sync_with_stdio(false);
int n;
cin >> n;
vector str(n, "");
string temp;
int num1=0;
vector pool;
for(int i=0;i> temp;
str[i] = clean(temp);
if(str[i].length()==0)
num1++;
else if(str[i][0]=='(')
pool.push_back(str[i].length());
else if(str[i][0]==')' && str[i].find('(')==-1)
pool.push_back(-str[i].length());
}
int num2=0;
for(int i=0;i<(int)pool.size();i++)
for(int j=i;j<(int)pool.size();j++)
if(pool[i]+pool[j]==0)
num2++;
cout<