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<iostream>
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<n;i++){
cin >> a;
r += last(a);
}
cout<<r<<endl;
}
2、
牛牛很喜欢对数字进行比较,但是对于3 > 2这种非常睿智的比较不感兴趣。上了高中之后,学习了数字的幂,他十分喜欢这种数字表示方法,比如xy。
由此,他想出了一种十分奇妙的数字比较方法,给出两个数字x和y,请你比较xy和yx的大小,如果前者大于后者,输出">",小于则输出"<",等于则输出"="。
输入描述:
两个数字x和y。
满足1 <= x,y <= 109
输出描述:
一个字符,">","<"或者"="。
输入例子1:
2 2
输出例子1:
=
输入例子2:
2 4
输出例子2:
=
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
int x,y;
cin>>x>>y;
if(x*log(y)>y*log(x))
{
cout<<"<"<<endl;
}
else if(x*log(y)<y*log(x))
{
cout<<">"<<endl;
}
else cout<<"="<<endl;
return 0;
}
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 <iostream>
#include <cmath>
using namespace std;
int main()
{
int n,k,count=0;
int a[2000];
cin>>n>>k;
for(int i=0;i<n;i++)
{
cin>>a[i];
}
while(n>k)
{
n=n-k+1;
count++;
}
cout<<count+1<<endl;
return 0;
}
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 <iostream>
#include <cstring>
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"<<endl;
}
else cout<<"NO"<<endl;
return 0;
}
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 <iostream>
#include <cstring>
#include <vector>
#include <stack>
using namespace std;
bool isHW(string s)
{
int i;
stack<char> cc;
for(i=0;i<s.length();i++)
{
if(s[i]==')' && !cc.empty())
{
cc.pop();
}
else if(s[i]==')' && cc.empty())
{
break;
}
else
{
cc.push(s[i]);
}
}
if(cc.empty() && i==s.length())
{
//cout<<"对的:"<<s<<endl;
return true;
}
else return false;
}
int main()
{
int n,count=0,num=0;
vector<string> 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<v.size();i++)
{
for(int j=i+1;j<v.size();j++)
{
if(isHW(v[i]+v[j])==true)
count++;
if(isHW(v[j]+v[i])==true)
count++;
}
}
cout<<count+num+num*(num-1)<<endl;
return 0;
}
二、分开讨论,链接:https://www.nowcoder.com/questionTerminal/98d6fa0bd6184b03a503febcee1b1082
来源:牛客网
- 合法判断:去除字符串中形如"()",直到不能去除为止,若字符串被清理为空,那么字符串合法,否则字符串不合法,变成以下三种:"(...("、")...)"、")...)(...("。考虑清理之后的字符串;
- n个字符串中,合法的字符串有num1个,不合法的字符串中,只有"(...("、")...)"能配成一组,二重循环遍历不合法字符串,配对数为num2;
- 最终结果为num1*num1+num2
链接:https://www.nowcoder.com/questionTerminal/98d6fa0bd6184b03a503febcee1b1082
来源:牛客网
#include<iostream>
#include<string>
#include<vector>
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<string> str(n, "");
string temp;
int num1=0;
vector<int> pool;
for(int i=0;i<n;i++){
cin >> 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<<num1*num1+num2<<endl;
}