首页

欢迎访问

牛课网2017年全国统一模拟笔试第二场

发布时间:2017-05-12 21:16:56
 
/*
[编程题] 1,最长公共连续子串
牛牛有两个字符串(可能包含空格),牛牛想找出其中最长的公共连续子串,希望你能帮助他,并输出其长度。 
输入描述:
输入为两行字符串(可能包含空格),长度均小于等于50.
 
 
输出描述:
输出为一个整数,表示最长公共连续子串的长度。
 
输入例子:
abcde
abgde
 
输出例子:
2
 
*/
 
import java.util.Scanner;
 
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String s1 = scanner.nextLine();
String s2 = scanner.nextLine();
 
fun(s1, s2);
 
}
 
public static void fun(String s1, String s2) {
 
int n = s1.length();
int m = s2.length();
int[][] a = new int[n][m];
int max = 0;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (s1.charAt(i) == s2.charAt(j)) {
if (i > 0 && j > 0) {
a[i][j] = a[i - 1][j - 1] + 1;
} else {
a[i][j] = 1;
}
 
if (max < a[i][j]) {
max = a[i][j];
}
 
}
 
}
 
}
System.out.println(max);
}
 
}
 
 
 
/*
[编程题]2,找整除
 
热度指数:6187
时间限制:1秒
空间限制:32768K
 
牛牛想在[a, b]区间内找到一些数满足可以被一个整数c整除,现在你需要帮助牛牛统计区间内一共有多少个这样的数满足条件?
 
输入描述:
首先输入两个整数a,b,(-5*10^8 ≤ a ≤ b ≤ 5*10^8)
接着是一个正整数c(1 <= c <= 1000)
 
输出描述:
输出一个整数表示个数。
 
输入例子:
0 14 5
 
输出例子:
3
*/
 
importjava.util.Scanner;
publicclassMain {
 
    publicstaticvoidmain(String[] args){
 
        Scanner in = newScanner(System.in);
 
        while(in.hasNext()){
 
            intbegin = in.nextInt();
 
            intend = in.nextInt();
 
            intnum = in.nextInt();
 
            //int count = 0;
 
            //for(int i = begin; i <= end; i++){
 
            //  if(i % num == 0){
 
                //  count++;
 
                //}
 
            //}
 
            //System.out.println(count);
 
            while(begin % num != 0){
 
                begin++;
 
            }
 
            if(begin > end){
 
                System.out.println(0);
 
            }else{
 
                System.out.println((end - begin) / num + 1);
 
            }
 
        }
 
    }
 
}
 
 
 
/*
[编程题] 3,组装三角形
牛牛手里有N根木棒,分别编号为1~N,现在他从N根里想取出三根木棒,使得三根木棒构成一个三角形,你能计算出牛牛有多少种取法吗?(考虑两种取法中使用的木棒编号有一个不一样就认为是不同的取法)。 
输入描述:
首先输入一个正整数N,接下来的一行共有N个正整数表示每个木棒的长度。
 
N ≤ 50, 木棒的长度 ≤ 10000.
 
 
输出描述:
输出一个整数表示方法数。
 
输入例子:
5
1 2 3 4 5
 
输出例子:
3
*/
import java.util.Arrays;
import java.util.Scanner;
 
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
 
int n=sc.nextInt();
int a[]=new int[n];
for (int i = 0; i <n; i++) {
a[i]=sc.nextInt();
 
}
Arrays.sort(a);
fun(n,a);
 
}
 
public static void fun(int n,int a[]) {
int sum=0;
for (int i = 0; i <n-2; i++) {
for (int j = i+1; j <n-1; j++) {
for (int m= j+1; m <n; m++) {
if (a[i]+a[j]>a[m]) {
sum++;
}
 
}
 
}
 
}
System.out.println(sum);
}
 
}
 
 
/*
[编程题] 4,最小的矩形
时间限制:1秒
空间限制:32768K
牛牛在二维坐标系中画了N个点,且都是整点。现在牛牛想画出一个矩形,使得这N个点都在矩形内或者在矩形上。
矩形的边均平行于坐标轴。牛牛希望矩形的面积最小。请你帮助牛牛计算下最小矩形的面积。 
输入描述:
首先输入一个正整数N表示点的个数(2 <= N <= 50)
  
接下来N行每行两个整数x, y,表示该点的坐标。绝对值均小于等于100.
 
 
输出描述:
一个整数表示最小矩形的面积。
 
输入例子:
2
0 1
1 0
 
输出例子:
1
*/
 
import java.util.Scanner;
public class Main{
    static Scanner in = new Scanner(System.in);
    public static void main(String[] args) {
        int n = in.nextInt();
        int maxX = Integer.MIN_VALUE,minX = Integer.MAX_VALUE;
        int maxY = Integer.MIN_VALUE,minY = Integer.MAX_VALUE;
        for(int i=1;i<=2*n;i++){
            int nums = in.nextInt();
            if(i%2 ==0){
                if(maxY < nums) maxY = nums;
                if(minY > nums) minY = nums;
            }else{
                if(maxX < nums) maxX = nums;
                if(minX > nums) minX = nums;
            }
        }
        int y = maxY - minY;
        int x = maxX - minX;
        System.out.println(y*x);
    }      
}
 
 
 
 
/*
[编程题] 5,平衡数
牛牛在研究他自己独创的平衡数,平衡数的定义是:将一个数分成左右两部分,分别成为两个新的数。
左右部分必须满足以下两点:
1,左边和右边至少存在一位。
2,左边的数每一位相乘如果等于右边的数每一位相乘,则这个数称为平衡数。
例如:1221这个数,分成12和21的话,1*2=2*1,则称1221为平衡数,再例如:1236这个数,可以分成123和1*2*3=6,所以1236也是平衡数。而1234无论怎样分也不满足平衡数。 
输入描述:
输入一个正整数(int范围内)。
 
 
输出描述:
如果该数是平衡数,输出 "YES", 否则输出 "NO"。
 
输入例子:
1221
1234
 
输出例子:
YES
NO
*/
import java.util.Scanner;
 
public class Main {
 
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String s=sc.nextLine();
int a[]=new int[s.length()];
for (int i = 0; i < a.length; i++) {
a[i]=s.charAt(i)-48;
// System.out.println(a[i]);
}
fun(a);
 
}
public static void fun(int[] a) {
 
for (int i = 1; i <a.length; i++) {
int sum1=1;
int sum2=1;
for (int j1 = 0; j1 <i; j1++) {
sum1*=a[j1];
 
}
 
for (int j2 = i; j2 <a.length; j2++) {
sum2*=a[j2];
 
 
}
if (sum1==sum2) {
System.out.println("YES");
return;
}
}
System.out.println("NO");
}
 
    
}
 
 
 
/*
[编程题] 6,字符串分类
牛牛有N个字符串,他想将这些字符串分类,他认为两个字符串A和B属于同一类需要满足以下条件:
A中交换任意位置的两个字符,最终可以得到B,交换的次数不限。比如:abc与bca就是同一类字符串。
现在牛牛想知道这N个字符串可以分成几类。 
输入描述:
首先输入一个正整数N(1 <= N <= 50),接下来输入N个字符串,每个字符串长度不超过50。
 
 
输出描述:
输出一个整数表示分类的个数。
 
输入例子:
4
abcd
abdc
dabc
bacd
 
输出例子:
1
*/
 
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Scanner;
import java.util.Set;
 
public class Main {
 
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n=Integer.parseInt(sc.nextLine());
Set<String> set=new HashSet<String>();
 
for (int i = 1; i <= n; i++) {
String str=sort(sc.nextLine());
set.add(str);
}
System.out.println(set.size());
}
public static String sort(String str) {
 char[] chars = str.toCharArray();
 Arrays.sort(chars);
 return new String(chars);
}
    
}
 
 
 
 
 
/*
[编程题] 7,创造新世界
众所周知计算机代码底层计算都是0和1的计算,牛牛知道这点之后就想使用0和1创造一个新世界!牛牛现在手里有n个0和m个1,给出牛牛可以创造的x种物品,每种物品都由一个01串表示。牛牛想知道当前手中的0和1可以最多创造出多少种物品。 
输入描述:
输入数据包括x+1行:
 
第一行包括三个整数x(2 ≤ x ≤ 20),n(0 ≤ n ≤ 500),m(0 ≤ m ≤ 500),以空格分隔
 
接下来的x行,每行一个01串item[i],表示第i个物品。每个物品的长度length(1 ≤ length ≤ 50)
 
 
输出描述:
输出一个整数,表示牛牛最多能创造多少种物品
 
输入例子:
3 3 1
1
00
100
 
输出例子:
2
 */
import java.util.Scanner;
 
public class Main {
 
@SuppressWarnings("resource")
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int x=sc.nextInt();
int n=sc.nextInt();
int m=sc.nextInt();
String ssString=sc.nextLine();
int s1[]=new int[x+1];//存0
int s2[]=new int[x+1];//存1
s1[0]=0;
s2[0]=0;
for(int i=1;i<=x;i++){
String temp=sc.nextLine();
 
for (int j = 0; j < temp.length(); j++) {
if (temp.charAt(j)==48) {
s1[i]++;
}else {
s2[i]++;
}
}
}
fun(x, n, m,s1,s2);
 
}
    public static void fun(int x,int n,int m,int s1[],int s2[]){
    int a[][]=new int[n+1][m+1];
    for (int i = 0; i <=n; i++) {
a[i][0]=0;
 
}
    for (int i = 0; i <=m; i++) {
    a[0][i]=0;
}
   
    for (int i = 1; i <=x; i++) {
    for (int j = n; j >= s1[i]; j--) 
    for (int k = m; k >= s2[i]; k--) 
    a[j][k] = Math.max(a[j][k], a[j - s1[i]][k - s2[i]] + 1);//关键递推关系 
 
}
   
    System.out.println(a[n][m]);
    }
    
}
 
 
 
/* 
[编程题] 8,优美的回文串
时间限制:1秒
空间限制:32768K
牛牛在书上看到一种字符串叫做回文串,当一个字符串从左到右和从右到左读都是一样的,就称这个字符串为回文串。牛牛又从好朋友羊羊那里了解到一种被称为优美的回文串的字符串,考虑一个长度为N只包含大写字母的字符串,写出它所有长度为M的连续子串(包含所有可能的起始位置的子串,相同的子串也要计入),如果这个字符串至少有K个子串都是回文串,我们就叫这个字符串为优美的回文串。现在给出一个N,牛牛希望你能帮他计算出长度为N的字符串有多少个是优美的回文串(每个位置都可以是'A'~'Z'的一个。) 
输入描述:
输入数据包括三个整数N, M, K(2 ≤ N ≤ 11, 2 ≤ M ≤ N, 0 ≤ K ≤ 11).
 
 
输出描述:
输出一个整数,表示所求的字符串个数.
 
输入例子:
2 2 1
 
输出例子:
26
长度为2的字符串,它长度为2的子串只有它自身。长度为2的回文串有"AA","BB","CC"..."ZZ",一共26种。
*/
。。。省略
我要评论+
评论列表