程序可以运行,只是复杂度方面可能有的问题还没解决= =
一、给出一个含有n个数字的序列a1,a2,a3,…an,可以进行以下操作:
一次操作定义为对这个序列的每个数字进行以下两种改变之一:
1.ai ÷ 2
2.ai × 3
每一次的操作中,必须保证至少有一个数字是第1种改变;并且经过每次操作后,每一个数字都必须是整数。
牛牛得知,每进行一次操作,他就可以得到一颗西瓜糖,但是由于孱弱的数学功底,他不知道何时该对某一个数字进行第一种还是第二种改变,这使得他十分纠结,于是他找来了睿智的你,希望你帮他计算出,他最多可以得到多少颗西瓜糖。
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
int[] a = new int[100000];//一开始写的1000提示内存问题,改为100000
int result = 0;
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();//有n个数
for(int i = 0; i int c = sc.nextInt();//读取每个整数
a[i] = c;
}
//这个当时看懂题目花了一些时间,一次操作是对所有整数做改变,所以这里就看2的倍数能被除几遍
for(int i = 0; i while(a[i]%2==0){
a[i] = a[i]/2;
result++;
}
}
//没有2的倍数,就直接输出0
if(result==0){
System.out.println(0);
}
else{
System.out.println(result);
}
}
}
二、牛牛很喜欢对数字进行比较,但是对于3 > 2这种非常睿智的比较不感兴趣。上了高中之后,学习了数字的幂,他十分喜欢这种数字表示方法,比如xy。
由此,他想出了一种十分奇妙的数字比较方法,给出两个数字x和y,请你比较xy和yx的大小,如果前者大于后者,输出”>”,小于则输出”<”,等于则输出”=”。
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
double a = sc.nextDouble();
double b = sc.nextDouble();
if(a==b){
System.out.println('=');
}
else{
//这里直接算次方数值太大了,在网上找到了公式,直接判断log(a)*b和log(b)*a的大小就OK了
double result = (Math.log(a)*b)-(Math.log(b)*a);
if(result==0){
System.out.println('=');
}
else if(result<0){
System.out.println('<');
}
else if(result>0){
System.out.println('>');
}
}
}
}
三、一般的括号匹配问题是这样的:
给出一个字符串,判断这个括号匹配是不是合法的括号匹配。
如”((” 和 “())”都不是合法的括号匹配,但是”()()()”,”(()())()”等就是合法的括号匹配。
这个问题解决起来非常简单,相信大家都知道怎么解决。
现在给出一个加强版的括号匹配问题: 给出n个由括号 ‘(’ 和 ‘)’ 组成的字符串,请计算出这些字符串中有多少对字符串满足si + sj是合法的括号匹配。如果si + sj和sj + si都是合法的括号匹配(i ≠ j),那么这两种搭配都需要计入答案;如果对于si,si + si是合法的括号匹配,那么也需要计入答案。
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String[] a = new String[100000];
int result = 0;
double n = sc.nextDouble();
for(int i = 0; i <= n; i++){
a[i] = sc.nextLine();
}
for(int i = 1; i <= n; i++){
//si + si是否合法
if(right(a[i],a[i])!=0){
result++;
}
for(int j = i+1; j <= n; j++){
//si + sj是否合法
if(right(a[i],a[j])!=0){
result++;
}
//sj + si是否合法
if(right(a[j],a[i])!=0){
result++;
}
}
}
System.out.println(result);
}
//这道题的测试只通过了80%,后边的应该是复杂度太高,可以去网上找找更好的方法
public static int right(String a,String b){
String s = a+b;
int left = 0;
for(int i = 0; i char ac = s.charAt(i);
if(ac=='('){
left++;
}
else if(ac==')'){
left--;
}
if(left<0){
return 0;
}
}
if(left!=0){
return 0;
}
return 1;
}
}
四、有一个长度为N的序列。一开始,这个序列是1, 2, 3,… n - 1, n的一个排列。
对这个序列,可以进行如下的操作:
每次选择序列中k个连续的数字,然后用这k个数字中最小的数字替换这k个数字中的每个数字。
我们希望进行了若干次操作后,序列中的每个数字都相等。请你找出需要操作的最少次数。
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
int result = 0;
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int l = sc.nextInt();
String s = sc.nextLine();
if (n == l) {
System.out.println(1);
} else {
if (n > l) {
//这里的1表示被减掉的l那部分是一次,剩下的每次都会有1个数是重复的,所以除以l-1
result = (n - l) / (l - 1) + 1;
//若是除完后还有余数,则还需要一次
if ((n - l) % (l - 1) > 0) {
result++;
}
}
System.out.println(result);
}
}
}
五、牛牛很喜欢玩接龙游戏,一天他突发奇想,发明了一种叫做“字符串链”的游戏。 这个游戏的规则是这样的,给出3个字符串A,B,C,如果它们满足以下两个条件,那么就可以构成一个“字符串链”:
1.A的最后一个字母和B的第一个字母相同;
2.B的最后一个字母和C的第一个字母相同。
现在牛牛给出了3个字符串A,B,C,希望你能判断这3个字符串能否构成一个“字符串链”,若能则输出“YES”,否则输出“NO”
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String[] a = new String[10];
for(int i = 0; i < 3; i++){
a[i] = sc.next();
}
//因为已经固定了是3个字符串,还是比较简单的
if(getlast(a[0])==getfirst(a[1])&& getlast(a[1])==getfirst(a[2])){
System.out.println("YES");
}
else{
System.out.println("NO");
}
}
public static char getlast(String a){
return a.charAt(a.length()-1);
}
public static char getfirst(String a){
return a.charAt(0);
}
}