qq_33524158 阅读(24) 评论(0)

Fibonacci数列

问题描述

Fibonacci数列的递推公式为:Fn=Fn-1+Fn-2,其中F1=F2=1。

当n比较大时,Fn也非常大,现在我们想知道,Fn除以10007的余数是多少。

输入格式

输入包含一个整数n。

输出格式

n

说明:在本题中,答案是要求Fn除以10007的余数,因此我们只要能算出这个余数即可,而不需要先计算出Fn的准确值,再将计算的结果除以10007取余数,直接计算余数往往比先算出原数再取余简单。

样例输入

10

样例输出

55

样例输入

22

样例输出

7704

数据规模与约定

1 <= n <= 1,000,000。

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
    public static void main(String[] args) throws IOException{
        BufferedReader reader=new BufferedReader(new InputStreamReader(System.in));
        String s=reader.readLine();
        int n=Integer.valueOf(s);
        int f1=1,f2=1,f3=0;
        if(n<3){
            System.out.print("1");
            return;}
        for(int i=3;i<=n;i++)
        {if(f1>10007)f1=f1%10007;
        if(f2>10007)f2=f2%10007;
        f3=f1+f2;
        f1=f2;
        f2=f3;
        }
        System.out.print(f3%10007);
        }

}

圆的面积

问题描述

给定圆的半径r,求圆的面积。

输入格式

输入包含一个整数r,表示圆的半径。

输出格式

说明:在本题中,输入是一个整数,但是输出是一个实数。

对于实数输出的问题,请一定看清楚实数输出的要求,比如本题中要求保留小数点后7位,则你的程序必须严格的输出7位小数,输出过多或者过少的小数位数都是不行的,都会被认为错误。

实数输出的问题如果没有特别说明,舍入都是按四舍五入进行。

样例输入

4

样例输出

50.2654825

数据规模与约定

1 <= r <= 10000。

提示

本题对精度要求较高,请注意π的值应该取较精确的值。你可以使用常量来表示π,比如PI=3.14159265358979323,也可以使用数学公式来求π,比如PI=atan(1.0)*4。

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.math.BigDecimal;


public class Main {

    /**
     * @param args
     * @throws IOException 
     */
    public static void main(String[] args) throws IOException {
        // TODO Auto-generated method stub
            BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
            BigDecimal  bg = new BigDecimal(bf.readLine());
            BigDecimal value = bg.multiply(bg.multiply(new BigDecimal(Math.PI))).setScale(7,BigDecimal.ROUND_HALF_UP);
            System.out.println(value);
    }
}

序列求和

问题描述
求1+2+3+…+n的值。
输入格式
输入包括一个整数n。
输出格式
输出一行,包括一个整数,表示1+2+3+…+n的值。
样例输入
4
样例输出
10
样例输入
100
说明:有一些试题会给出多组样例输入输出以帮助你更好的做题。

一般在提交之前所有这些样例都需要测试通过才行,但这不代表这几组样例数据都正确了你的程序就是完全正确的,潜在的错误可能仍然导致你的得分较低。

样例输出
5050
数据规模与约定
1 <= n <= 1,000,000,000。
说明:请注意这里的数据规模。

本题直接的想法是直接使用一个循环来累加,然而,当数据规模很大时,这种“暴力”的方法往往会导致超时。此时你需要想想其他方法。你可以试一试,如果使用1000000000作为你的程序的输入,你的程序是不是能在规定的上面规定的时限内运行出来。

本题另一个要值得注意的地方是答案的大小不在你的语言默认的整型(int)范围内,如果使用整型来保存结果,会导致结果错误。

如果你使用C++或C语言而且准备使用printf输出结果,则你的格式字符串应该写成%I64d以输出long long类型的整数。

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
    public static void main(String args[]) throws NumberFormatException, IOException{
        BufferedReader strin = new BufferedReader(new InputStreamReader(System.in));
        long i = Integer.parseInt(strin.readLine());
        long sum = (1+i)*i/2;
        System.out.println(sum);
    }
}

A+B问题

问题描述

说明:在“问题描述”这部分,会给出试题的意思,以及所要求的目标。

输入格式

说明:“输入格式”是描述在测试你的程序时,所给的输入一定满足的格式。

做题时你应该假设所给的输入是一定满足输入格式的要求的,所以你不需要对输入的格式进行检查。多余的格式检查可能会适得其反,使用你的程序错误。

在测试的时候,系统会自动将输入数据输入到你的程序中,你不能给任何提示。比如,你在输入的时候提示“请输入A、B”之类的话是不需要的,这些多余的输出会使得你的程序被判定为错误。

输出格式

说明:“输出格式”是要求你的程序在输出结果的时候必须满足的格式。

在输出时,你的程序必须满足这个格式的要求,不能少任何内容,也不能多任何内容。如果你的内容和输出格式要求的不一样,你的程序会被判断为错误,包括你输出了提示信息、中间调试信息、计时或者统计的信息等。

样例输入

说明:“样例输入”给出了一组满足“输入格式”要求的输入的例子。

这里给出的输入只是可能用来测试你的程序的一个输入,在测试的时候,还会有更多的输入用来测试你的程序。

样例输出

说明:“样例输出”给出了一组满足“输出格式”要求的输出的例子。

样例输出中的结果是和样例输入中的是对应的,因此,你可以使用样例的输入输出简单的检查你的程序。

要特别指出的是,能够通过样例输入输出的程序并不一定是正确的程序,在测试的时候,会用很多组数据进行测试,而不局限于样例数据。有可能一个程序通过了样例数据,但测试的时候仍只能得0分,可能因为这个程序只在一些类似样例的特例中正确,而不具有通用性,再测试更多数据时会出现错误。

比如,对于本题,如果你写一个程序不管输入是什么都输入57,则样例数据是对的,但是测试其他数据,哪怕输入是1和2,这个程序也输出57,则对于其他数据这个程序都不正确。

数据规模与约定

说明:“数据规模与约定”中给出了试题中主要参数的范围。

这个范围对于解题非常重要,不同的数据范围会导致试题需要使用不同的解法来解决。比如本题中给的A、B范围不大,可以使用整型(int)来保存,如果范围更大,超过int的范围,则要考虑其他方法来保存大数。

有一些范围在方便的时候是在“问题描述”中直接给的,所以在做题时不仅要看这个范围,还要注意问题描述。

提示

本题的C++源代码如下:

  1. #include

    1. using namespace std;

    1. int main()
  2. {
  3. ​ int a, b;
  4. ​ cin >> a >> b;
  5. ​ cout << a + b;
  6. ​ return 0;
  7. }

本题的C源代码如下:

  1. #include
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

class Main
{
    public static void main(String[] args) throws IOException
    {
        args = new BufferedReader(new InputStreamReader(System.in)).readLine().split(" ");
        System.out.println(Integer.parseInt(args[0])+Integer.parseInt(args[1]));
    }
}

排序

问题描述

  给定一个长度为n的数列,将这个数列按从小到大的顺序排列。1<=n<=200

输入格式

  第一行为一个整数n。
  第二行包含n个整数,为待排序的数,每个整数的绝对值小于10000。

输出格式

  输出一行,按从小到大的顺序输出排序后的数列。

样例输入

5
8 3 6 4 9

样例输出

3 4 6 8 9

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;

public class Main {

    public static void main(String[] args) throws NumberFormatException, IOException {

        BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
        int num =Integer.parseInt(bf.readLine());

        String s = bf.readLine();
        int arr [] = sort(s);
        for (int i = 0; i < num; i++) {
            if(Math.abs(arr[i])>10000){
                continue;
            }
            System.out.print(arr[i]+" ");
        }
    }

    private static int [] sort(String s) {
            String [] str = s.split(" ");
            int [] arr = new int[str.length];
            for (int i = 0; i < str.length; i++) {
                arr[i] = Integer.parseInt(str[i]);
            }

            for (int i = 0; i < arr.length - 1; i++) {
                for (int j = i+1; j < arr.length; j++) {
                    if(arr[i] > arr[j]){
                        int temp  = arr[i];
                        arr[i] = arr[j];
                        arr[j] = temp;
                    }
                }
            }
            return arr;
    }

}

特殊回文数

问题描述

  123321是一个非常特殊的数,它从左边读和从右边读是一样的。
  输入一个正整数n, 编程求所有这样的五位和六位十进制数,满足各位数字之和等于n 。

输入格式

  输入一行,包含一个正整数n。

输出格式

  按从小到大的顺序输出满足条件的整数,每个整数占一行。

样例输入

​ 52

样例输出

​ 899998
989989
998899

数据规模和约定

  1<=n<=54。

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;

public class Main {
    public static void main(String args[]) throws NumberFormatException,
            IOException {
        BufferedReader buffer = new BufferedReader(new InputStreamReader(
                System.in));
        int n = Integer.parseInt(buffer.readLine());
        ArrayList<String> array = new ArrayList<String>();

        for (int i = 1; i < 10; i++) {
            for (int j = 0; j < 10; j++) {
                for (int k = 0; k < 10; k++) {
                    if ((i + j) * 2 + k == n)
                        array.add("" + i + j + k + j + i);
                }
            }
        }

        for (int i = 1; i < 10; i++) {
            for (int j = 0; j < 10; j++) {
                for (int k = 0; k < 10; k++) {
                    if ((i + j + k) * 2 == n)
                        array.add("" + i + j + k + k + j + i);
                }
            }
        }

        for (int i = 0; i < array.size(); i++) {
            System.out.println(array.get(i));
        }
    }
}

回文数

问题描述

  1221是一个非常特殊的数,它从左边读和从右边读是一样的,编程求所有这样的四位十进制数。

输出格式

  按从小到大的顺序输出满足条件的四位十进制数。

public class Main {

    public static void main(String[] args) {
        for (int i = 1000; i < 10000; i++) {
            int a = i / 1000;
            int b = i % 1000 / 100;
            int c = i % 100 / 10;
            int d = i % 10;
            if (a == d && b == c) {
                System.out.println(i);
            }
        }
    }

}

特殊的数字

问题描述

  153是一个非常特殊的数,它等于它的每位数字的立方和,即153=1*1*1+5*5*5+3*3*3。编程求所有满足这种条件的三位十进制数。

输出格式

  按从小到大的顺序输出满足条件的三位十进制数,每个数占一行。

import java.util.Arrays;
public class Main{
    public static void main(String args[]){
        StringBuffer string = new StringBuffer();
        for(int a=1;a<10;a++){
            for(int b=0;b<10;b++){
                for(int c=0;c<10;c++){
                    if(Math.pow(a, 3)+Math.pow(b, 3)+Math.pow(c,3)==(a*100+b*10+c)){
                        string.append(a*100+b*10+c+",");
                    }
                }
            }
        }
        String[] str = string.toString().split(",");
        int[] num = new int[str.length];
        for(int i=0;i<str.length;i++){
            num[i] = Integer.parseInt(str[i]);
        }
        Arrays.sort(num);
        for(int i:num){
            System.out.println(i);
        }
    }
}

杨辉三角

问题描述

​ 杨辉三角形又称Pascal三角形,它的第i+1行是(a+b)i的展开式的系数。

​ 它的一个重要性质是:三角形中的每个数字等于它两肩上的数字相加。

​ 下面给出了杨辉三角形的前4行:

​ 1

​ 1 1

​ 1 2 1

​ 1 3 3 1

​ 给出n,输出它的前n行。

输入格式

​ 输入包含一个数n。

输出格式

​ 输出杨辉三角形的前n行。每一行从这一行的第一个数开始依次输出,中间使用一个空格分隔。请不要在前面输出多余的空格。

样例输入

​ 4

样例输出

1
1 1
1 2 1
1 3 3 1

数据规模与约定

​ 1 <= n <= 34。

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;          

public class Main{
    public static void main(String args[]) throws IOException{
        BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
        int n=Integer.parseInt(br.readLine());
        int[][] a=new int[34][34];
        int i=0,j=1;
        while(i<34){
            a[i][0]=1;
            i++;
        }
        while(j<34){
            a[j][j]=1;
            j++;
        }
        for(i=2;i<34;i++)
           for(j=1;j<i;j++)
              a[i][j]=a[i-1][j-1]+a[i-1][j];
        for(i=0;i<n;i++)
           {for(j=0;j<=i;j++)
             System.out.print(a[i][j]+" ");
           System.out.println(" ");}
}
}                  

查找整数

问题描述

​ 给出一个包含n个整数的数列,问整数a在数列中的第一次出现是第几个。

输入格式

​ 第一行包含一个整数n。

​ 第二行包含n个非负整数,为给定的数列,数列中的每个数都不大于10000。

​ 第三行包含一个整数a,为待查找的数。

输出格式

​ 如果a在数列中出现了,输出它第一次出现的位置(位置从1开始编号),否则输出-1。

样例输入

​ 6
1 9 4 8 3 9
9

样例输出

​ 2

数据规模与约定

​ 1 <= n <= 1000。

import java.io.*;
import java.util.Arrays;
import java.util.Scanner;
import java.io.InputStreamReader;

public class Main 
{

    static int fun(int[] num,int nn)
    {
        for(int i=0;i<num.length;i++)
        {
            if(num[i]==nn)
                return i+1;             
        }
        return -1;
    }

    public static void main(String[] args) throws NumberFormatException, IOException 
    {
        BufferedReader bf1=new BufferedReader(new InputStreamReader(System.in));
        int n=Integer.parseInt(bf1.readLine());
        String[] s1=bf1.readLine().split(" ");
        int[] num=new int[n];
        for(int i=0;i<n;i++)
            num[i]=Integer.parseInt(s1[i]);
        int nn=Integer.parseInt(bf1.readLine());
        System.out.println(fun(num, nn));

    }

}

数列特征

问题描述

​ 给出n个数,找出这n个数的最大值,最小值,和。

输入格式

​ 第一行为整数n,表示数的个数。

​ 第二行有n个数,为给定的n个数,每个数的绝对值都小于10000。

输出格式

​ 输出三行,每行一个整数。第一行表示这些数中的最大值,第二行表示这些数中的最小值,第三行表示这些数的和。

样例输入

​ 5
1 3 -2 4 5

样例输出

​ 5
-2
11

数据规模与约定

​ 1 <= n <= 10000。

import java.io.*;
public class Main{
    public static void main(String args[])throws Exception{
        int n;
        int sum=0;
        String str=null;
        String str2=null;
        BufferedReader buf=new BufferedReader(new InputStreamReader(System.in));

        str=buf.readLine();
        n=Integer.parseInt(str);

        str2=buf.readLine();
        String a[]=str2.split(" ");
        int array2[]=new int[n];
        for(int i=0;i<n;i++){

            array2[i]=Integer.parseInt(a[i]);
            sum=sum+array2[i];
        }
        java.util.Arrays.sort(array2);
        System.out.println(array2[n-1]);
        System.out.println(array2[0]);
        System.out.println(sum);
    }

}

字母图形

问题描述

利用字母可以组成一些美丽的图形,下面给出了一个例子:

ABCDEFG

BABCDEF

CBABCDE

DCBABCD

EDCBABC

这是一个5行7列的图形,请找出这个图形的规律,并输出一个n行m列的图形。

输入格式

​ 输入一行,包含两个整数n和m,分别表示你要输出的图形的行数的列数。

输出格式

​ 输出n行,每个m个字符,为你的图形。

样例输入

​ 5 7

样例输出

​ ABCDEFG
BABCDEF
CBABCDE
DCBABCD
EDCBABC

数据规模与约定

​ 1 <= n, m <= 26。

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
class Main
{
    public static void main(String[] args) throws IOException
    {
        BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
        String s=br.readLine();
        String sa[]=s.split(" ");
        char  a[ ]=new char[ Integer.parseInt(sa[1])];
        int max=Integer.parseInt(sa[0]);      
        int t=0;
        for(int j=0;j<a.length;j++){        
           a[ j ]=(char) ('B'+j);  
        }

        for(int k=0;k<max;k++){                            
        for(int i=0;i<a.length;i++){  
                if(i<t){    
                a[i]=(char)(a[i]+1);
                }else{
                a[i]=(char)(a[i]-1);
                }
            }
            t++;
            System.out.print(a);
            System.out.println();
        }
    }
}

01字串

问题描述

对于长度为5位的一个01串,每一位都可能是0或1,一共有32种可能。它们的前几个是:

​ 00000

​ 00001

​ 00010

​ 00011

​ 00100

​ 请按从小到大的顺序输出这32种01串。

输入格式

​ 本试题没有输入。

输出格式

​ 输出32行,按从小到大的顺序每行一个长度为5的01串。

样例输出

​ 00000
00001
00010
00011
<以下部分省略>

public class Main{
public static void main (String args[]){

for(int a1=0;a1<2;a1++){
    for(int a2=0;a2<2;a2++){
        for(int a3=0;a3<2;a3++){
            for(int a4=0;a4<2;a4++){
                for(int a5=0;a5<2;a5++){
                    StringBuffer s=new StringBuffer();
                    System.out.println(s.append(a1).append(a2).append(a3).append(a4).append(a5));
                }
            }
        }
    }
}

}
}

闰年判断

问题描述

给定一个年份,判断这一年是不是闰年。

当以下情况之一满足时,这一年是闰年:

  1. 年份是4的倍数而不是100的倍数;
  2. 年份是400的倍数。

其他的年份都不是闰年。

输入格式

​ 输入包含一个整数y,表示当前的年份。

输出格式

​ 说明:当试题指定你输出一个字符串作为结果(比如本题的yes或者no,你需要严格按照试题中给定的大小写,写错大小写将不得分。

样例输入

​ 2013

样例输出

​ no

样例输入

​ 2016

样例输出

​ yes

数据规模与约定

​ 1990 <= y <= 2050。

import java.io.*;
import java.util.Scanner;
import java.io.InputStreamReader;
import java.*;
public class Main 
{   

    public static void main(String[] args) throws NumberFormatException, IOException 
    {
        BufferedReader bf1=new BufferedReader(new InputStreamReader(System.in));
        int num=Integer.parseInt(bf1.readLine());       
            if((num%4==0&&num%100!=0)||(num%400==0))
                System.out.println("yes");
            else
                System.out.println("no");           


    }
}

阶乘计算

问题描述

  输入一个正整数n,输出n!的值。
  其中n!=1*2*3*…*n

算法描述

  n!可能很大,而计算机能表示的整数范围有限,需要使用高精度计算的方法。使用一个数组A来表示一个大整数aA[0]表示a的个位,A[1]表示a的十位,依次类推。
  将a乘以一个整数k变为将数组A的每一个元素都乘以k,请注意处理相应的进位。
  首先将a设为1,然后乘2,乘3,当乘到n时,即得到了n!的值。

输入格式

  输入包含一个正整数nn<=1000。

输出格式

  输出n!的准确值。

样例输入

10

样例输出

3628800

import java.math.BigInteger;
import java.util.*;
public class Main{
    protected static ArrayList table = new ArrayList();
    static {
        table.add(BigInteger.valueOf(1));
    }
    public static synchronized BigInteger factorial(int x) {
        for (int size = table.size(); size <= x; size++) {
            BigInteger lastfact = (BigInteger) table.get(size - 1);
            BigInteger nextfact = lastfact.multiply(BigInteger.valueOf(size));
            table.add(nextfact);
        }
        return (BigInteger) table.get(x);
    }
    public static void main(String[] args) {
        Scanner s=new Scanner(System.in);
        int n=s.nextInt();
        System.out.print(factorial(n));
    }
}

高精度加法

问题描述

  输入两个整数ab,输出这两个整数的和。ab都不超过100位。

算法描述

  由于ab都比较大,所以不能直接使用语言中的标准数据类型来存储。对于这种问题,一般使用数组来处理。
  定义一个数组AA[0]用于存储a的个位,A[1]用于存储a的十位,依此类推。同样可以用一个数组B来存储b
  计算c = a + b的时候,首先将A[0]与B[0]相加,如果有进位产生,则把进位(即和的十位数)存入r,把和的个位数存入C[0],即C[0]等于(A[0]+B[0])%10。然后计算A[1]与B[1]相加,这时还应将低位进上来的值r也加起来,即C[1]应该是A[1]、B[1]和r三个数的和.如果又有进位产生,则仍可将新的进位存入到r中,和的个位存到C[1]中。依此类推,即可求出C的所有位。
  最后将C输出即可。

输入格式

  输入包括两行,第一行为一个非负整数a,第二行为一个非负整数b。两个整数都不超过100位,两数的最高位都不是0。

输出格式

  输出一行,表示a + b的值。

样例输入

20100122201001221234567890
2010012220100122

样例输出

20100122203011233454668012

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main{
    public static void main(String[] args) throws NumberFormatException, IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String s1 = br.readLine();
        String s2 = br.readLine();
        int a[] = new int[100000];
        int b[] = new int[100000];
        int l1 = s1.length();
        int l2 = s2.length();
        for(int i=0; i<l1; i++){
            //返回指定的Unicode字符表示的int值
            a[l1-1-i] = Character.getNumericValue(s1.charAt(i));
        }
        for(int i=0; i<l2; i++){
            b[l2-1-i] = Character.getNumericValue(s2.charAt(i));
        }
        int max = l1>l2?l1:l2;
        int c[] = new int[100000];
        for(int i=0; i<max; i++){
            c[i] = a[i] + b[i];
        }
        for(int i=0; i<max-1; i++){
            if(c[i]>9){
                c[i+1] += c[i]/10;
                c[i] = c[i]%10;
            }
        }
        for(int i=max-1; i>=0; i--){
            System.out.print(c[i]); 
        }
    }
}

Huffuman树

问题描述

  Huffman树在编码中有着广泛的应用。在这里,我们只关心Huffman树的构造过程。
  给出一列数{pi}={p*0, *p*1, …, *pn-1},用这列数构造Huffman树的过程如下:
  1. 找到{pi}中最小的两个数,设为papb,将papb从{pi}中删除掉,然后将它们的和加入到{pi}中。这个过程的费用记为pa + pb
  2. 重复步骤1,直到{pi}中只剩下一个数。
  在上面的操作过程中,把所有的费用相加,就得到了构造Huffman树的总费用。
  本题任务:对于给定的一个数列,现在请你求出用该数列构造Huffman树的总费用。
  例如,对于数列{pi}={5, 3, 8, 2, 9},Huffman树的构造过程如下:
  1. 找到{5, 3, 8, 2, 9}中最小的两个数,分别是2和3,从{pi}中删除它们并将和5加入,得到{5, 8, 9, 5},费用为5。
  2. 找到{5, 8, 9, 5}中最小的两个数,分别是5和5,从{pi}中删除它们并将和10加入,得到{8, 9, 10},费用为10。
  3. 找到{8, 9, 10}中最小的两个数,分别是8和9,从{pi}中删除它们并将和17加入,得到{10, 17},费用为17。
  4. 找到{10, 17}中最小的两个数,分别是10和17,从{pi}中删除它们并将和27加入,得到{27},费用为27。
  5. 现在,数列中只剩下一个数27,构造过程结束,总费用为5+10+17+27=59。

输入格式

  输入的第一行包含一个正整数nn<=100)。
  接下来是n个正整数,表示p*0, *p*1, …, *pn-1,每个数不超过1000。

输出格式

  输出用这些数构造Huffman树的总费用。

样例输入

5
5 3 8 2 9

样例输出

59

import java.io.*;
import java.math.BigInteger;
public class Main {
    public static void main(String[] args)throws IOException {
    BufferedReader buf=new BufferedReader(new InputStreamReader(System.in));
    int n=Integer.parseInt(buf.readLine());
    String str=buf.readLine();
    String s[]=str.split(" ");
     int sum=0;
     int a[] =new int[n];
     int num=0;
      for(int i=0;i<n;i++)
             a[i]=Integer.parseInt(s[i]);
              java.util.Arrays.sort(a);
              if(n>1){
                  sum=a[0]+a[1];
                  num=sum;
                  a[1]=num;
                  for(int j=2;j<n;j++){
                      if(j<n){
                          java.util.Arrays.sort(a);
                          num=a[j-1]+a[j];
                         a[j]=num;
                         java.util.Arrays.sort(a);
                         sum+=num;
                      }

                  }
                  }
                  else {

                     sum=a[0];
                  }
            System.out.println(sum);

        }

}

2n皇后问题

问题描述

  给定一个n*n的棋盘,棋盘中有一些位置不能放皇后。现在要向棋盘中放入n个黑皇后和n个白皇后,使任意的两个黑皇后都不在同一行、同一列或同一条对角线上,任意的两个白皇后都不在同一行、同一列或同一条对角线上。问总共有多少种放法?n小于等于8。

输入格式

  输入的第一行为一个整数n,表示棋盘的大小。
  接下来n行,每行n个0或1的整数,如果一个整数为1,表示对应的位置可以放皇后,如果一个整数为0,表示对应的位置不可以放皇后。

输出格式

  输出一个整数,表示总共有多少种放法。

样例输入

4
1 1 1 1
1 1 1 1
1 1 1 1
1 1 1 1

样例输出

2

样例输入

4
1 0 1 1
1 1 1 1
1 1 1 1
1 1 1 1

样例输出

0

import java.util.Scanner;

public class Main {
    public static int n = 0;
    public static int a[] = new int[10];
    public static int isa[][] = new int[10][10];
    public static boolean flag = false;
    public static int sum = 0;

    public static boolean judge(int k) {
        for (int j = 1; j < k; j++) {
            if (Math.abs(j - k) == Math.abs(a[j] - a[k]) || a[j] == a[k])
                return false;
        }
        return true;
    }

    public static void place(int t) {
        if (t > n && !flag) {
            flag = true;
            place(1);
            flag = false;
        } else if (t > n && flag) {
            sum++;
        } else {
            for (int i = 1; i <= n; i++) {
                if (isa[t][i] == 1) {
                    int temp = a[t]; 
                    a[t] = i;
                    if (judge(t)) {
                        isa[t][i] = 2;
                        place(t + 1);
                        isa[t][i] = 1;
                    }
                    a[t] = temp;
                }
            }
        }
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        n = sc.nextInt();
        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= n; j++) {
                isa[i][j] = sc.nextInt();
            }
        }
        place(1);
        System.out.println(sum);
    }
}

报时助手

问题描述

  给定当前的时间,请用英文的读法将它读出来。
  时间用时h和分m表示,在英文的读法中,读一个时间的方法是:
  如果m为0,则将时读出来,然后加上“o’clock”,如3:00读作“three o’clock”。
  如果m不为0,则将时读出来,然后将分读出来,如5:30读作“five thirty”。
  时和分的读法使用的是英文数字的读法,其中0~20读作:
  0:zero, 1: one, 2:two, 3:three, 4:four, 5:five, 6:six, 7:seven, 8:eight, 9:nine, 10:ten, 11:eleven, 12:twelve, 13:thirteen, 14:fourteen, 15:fifteen, 16:sixteen, 17:seventeen, 18:eighteen, 19:nineteen, 20:twenty。
  30读作thirty,40读作forty,50读作fifty。
  对于大于20小于60的数字,首先读整十的数,然后再加上个位数。如31首先读30再加1的读法,读作“thirty one”。
  按上面的规则21:54读作“twenty one fifty four”,9:07读作“nine seven”,0:15读作“zero fifteen”。

输入格式

  输入包含两个非负整数h和m,表示时间的时和分。非零的数字前没有前导0。h小于24,m小于60。

输出格式

  输出时间时刻的英文。

样例输入

0 15

样例输出

zero fifteen

import java.io.*;
        public class Main {
            public static void main(String[] args)throws IOException {
            BufferedReader buf=new BufferedReader(new InputStreamReader(System.in));
            String str=buf.readLine();
            String s[]=str.split(" ");
            StringBuffer bf=new StringBuffer();
             int i=Integer.parseInt(s[0]);
            int n=Integer.parseInt(s[1]);
            switch(i){
            case 0:{
                bf.append("zero ");
                break;
            }
            case 1:{
                bf.append("one ");
                break;
            }
            case 2:{
                bf.append("two ");
                break;
            }
            case 3:{
                bf.append("three ");
                break;
            }
            case 4:{
                bf.append("four ");
                break;
            }
            case 5:{
                bf.append("five ");
                break;
            }
            case 6:{
                bf.append("six ");
                break;
            }
            case 7:{
                bf.append("seven ");
                break;
            }
            case 8:{
                bf.append("eight ");
                break;
            }
            case 9:{
                bf.append("nine ");
                break;
            }
            case 10:{
                bf.append("ten ");
                break;
            }
            case 11:{
                bf.append("eleven ");
                break;
            }
            case 12:{
                bf.append("twelve ");
                break;
            }
            case 13:{
                bf.append("thirteen ");
                break;
            }
            case 14:{
                bf.append("fourteen ");
                break;
            }
            case 15:{
                bf.append("fifteen ");
                break;
            }
            case 16:{
                bf.append("sixteen ");
                break;
            }
            case 17:{
                bf.append("seventeen ");
                break;
            }
            case 18:{
                bf.append("eighteen ");
                break;
            }
            case 19:{
                bf.append("nineteen ");
                break;
            }
            case 20:{
                bf.append("twenty ");
                break;
            }
            case 21:{
                bf.append("twenty one ");
                break;
            }
            case 22:{
                bf.append("twenty two ");
                break;
            }
            case 23:{
                bf.append("twenty three ");
                break;
            }

            }
            if(n==0){
                bf.append("o'clock");
            }
            else if(n/10<2){
                switch(n){
                case 1:{
                    bf.append("one");
                    break;
                }
                case 2:{
                    bf.append("two");
                    break;
                }
                case 3:{
                    bf.append("three");
                    break;
                }
                case 4:{
                    bf.append("Zero");
                    break;
                }
                case 5:{
                    bf.append("five");
                    break;
                }
                case 6:{
                    bf.append("six");
                    break;
                }
                case 7:{
                    bf.append("seven");
                    break;
                }
                case 8:{
                    bf.append("eight");
                    break;
                }
                case 9:{
                    bf.append("nine");
                    break;
                }
                case 10:{
                    bf.append("ten");
                    break;
                }
                case 11:{
                    bf.append("eleven");
                    break;
                }
                case 12:{
                    bf.append("twelve ");
                    break;
                }
                case 13:{
                    bf.append("thirteen ");
                    break;
                }
                case 14:{
                    bf.append("fourteen ");
                    break;
                }
                case 15:{
                    bf.append("fifteen ");
                    break;
                }
                case 16:{
                    bf.append("sixteen ");
                    break;
                }
                case 17:{
                    bf.append("seventeen ");
                    break;
                }
                case 18:{
                    bf.append("eighteen ");
                    break;
                }
                case 19:{
                    bf.append("nineteen ");
                    break;
                }
            }
         }
            else {
                switch(n/10){
                case 2:{
                    bf.append("twenty ");
                    break;
                }
                case 3:{
                    bf.append("thirty ");
                    break;
                }
                case 4:{
                    bf.append("forty ");
                    break;
                }
                case 5:{
                    bf.append("fifty ");
                    break;
                }


            }
                switch(n%10){
                case 1:{
                    bf.append("one");
                    break;
                }
                case 2:{
                    bf.append("two");
                    break;
                }
                case 3:{
                    bf.append("three");
                    break;
                }
                case 4:{
                    bf.append("four");
                    break;
                }
                case 5:{
                    bf.append("five");
                    break;
                }
                case 6:{
                    bf.append("six");
                    break;
                }
                case 7:{
                    bf.append("seven");
                    break;
                }
                case 8:{
                    bf.append("eight");
                    break;
                }
                case 9:{
                    bf.append("nine");
                    break;
                }
            }
}
            System.out.println(bf.toString());
            }
}

回形取数

问题描述

  回形取数就是沿矩阵的边取数,若当前方向上无数可取或已经取过,则左转90度。一开始位于矩阵左上角,方向向下。

输入格式

  输入第一行是两个不超过200的正整数m, n,表示矩阵的行和列。接下来m行每行n个整数,表示这个矩阵。

输出格式

  输出只有一行,共mn个数,为输入矩阵回形取数得到的结果。数之间用一个空格分隔,行末不要有多余的空格。

样例输入

3 3
1 2 3
4 5 6
7 8 9

样例输出

1 4 7 8 9 6 3 2 5

样例输入

3 2
1 2
3 4
5 6

样例输出

1 3 5 6 4 2

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
public class Main{

    /**
     * @param args
     */
    public static void main(String[] args)throws IOException{
        // TODO Auto-generated method stub
        BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
        int[] nm=new int[2];
        String[] s=br.readLine().split(" ");
        for(int i=0;i<2;i++){
            nm[i]=Integer.parseInt(s[i]);
        }
        int m=nm[0],n=nm[1];
        //System.out.println(n+"   "+m);
        int[][] arr=new int[m][n];
        for(int i=0;i<m;i++){
            String s1=br.readLine();
            String[] str=s1.split(" ");
            for(int j=0;j<n;j++){
                arr[i][j]=Integer.parseInt(str[j]); 
            }
        }
        int  num=n*m,brr=0;
        int i=0,j=0,x=0,y=0,z=0;
        for(int ii=0;ii<num;ii++){
            if(j<n&&x<m){
                brr=arr[i][j];
                if(i<m-1){
                  i++;
                }
                x++;
                 }
            else if(j<n-1&&i==m-1){
                j++;
                y++;
            brr=arr[i][j];
            }
            else if(j==y&&i>z){
                i--;
                brr=arr[i][j];
            }
            else if(i==z&&j>z){
                j--;
                brr=arr[i][j];
                if(i==z&&j==z+1){
                    z++;
                    i++;
                    m=m-1;
                    n=n-1;
                    x=z;
                    y=z;
                }
            }
            System.out.print(brr+" ");
        }

        }
}

龟兔赛跑预测

问题描述

  话说这个世界上有各种各样的兔子和乌龟,但是研究发现,所有的兔子和乌龟都有一个共同的特点——喜欢赛跑。于是世界上各个角落都不断在发生着乌龟和兔子的比赛,小华对此很感兴趣,于是决定研究不同兔子和乌龟的赛跑。他发现,兔子虽然跑比乌龟快,但它们有众所周知的毛病——骄傲且懒惰,于是在与乌龟的比赛中,一旦任一秒结束后兔子发现自己领先t米或以上,它们就会停下来休息s秒。对于不同的兔子,t,s的数值是不同的,但是所有的乌龟却是一致——它们不到终点决不停止。
  然而有些比赛相当漫长,全程观看会耗费大量时间,而小华发现只要在每场比赛开始后记录下兔子和乌龟的数据——兔子的速度v1(表示每秒兔子能跑v1米),乌龟的速度v2,以及兔子对应的t,s值,以及赛道的长度l——就能预测出比赛的结果。但是小华很懒,不想通过手工计算推测出比赛的结果,于是他找到了你——清华大学计算机系的高才生——请求帮助,请你写一个程序,对于输入的一场比赛的数据v1,v2,t,s,l,预测该场比赛的结果。

输入格式

  输入只有一行,包含用空格隔开的五个正整数v1,v2,t,s,l,其中(v1,v2<=100;t<=300;s<=10;l<=10000且为v1,v2的公倍数)

输出格式

  输出包含两行,第一行输出比赛结果——一个大写字母“T”或“R”或“D”,分别表示乌龟获胜,兔子获胜,或者两者同时到达终点。
  第二行输出一个正整数,表示获胜者(或者双方同时)到达终点所耗费的时间(秒数)。

样例输入

10 5 5 2 20

样例输出

D
4

样例输入

10 5 5 1 20

样例输出

R
3

样例输入

10 5 5 3 20

样例输出

T
4

import java.io.*;
public class Main {
    public static void main(String[] args)throws Exception {
        BufferedReader bf=new BufferedReader(new InputStreamReader(System.in));
        String str[]=bf.readLine().split(" ");
        int v1=Integer.parseInt(str[0]);
        int v2=Integer.parseInt(str[1]);
        int t=Integer.parseInt(str[2]);
        int s=Integer.parseInt(str[3]);
        int l=Integer.parseInt(str[4]);
        int x=0,y=0,time=0;
        for(int i=1;i<=l;i++){
            if(x-y<t){
                x+=v1;
                y+=v2;               
            }
            else{
                for(int j=1;j<=s;j++){
                    i=i+1;
                   y+=v2;
                if(y==l)
                    break;
                }
                i=i-1;
            }
            if(x==l||y==l){
                time=i;
                break;
        }
        }
        if(y==l&&x<l)
            System.out.println("T");
        if(x==l&&y<l)
            System.out.println("R");
        if(y==l&&x==l)
            System.out.println("D");
        System.out.println(time);
    }
}

芯片测试

问题描述

  有n(2≤n≤20)块芯片,有好有坏,已知好芯片比坏芯片多。
  每个芯片都能用来测试其他芯片。用好芯片测试其他芯片时,能正确给出被测试芯片是好还是坏。而用坏芯片测试其他芯片时,会随机给出好或是坏的测试结果(即此结果与被测试芯片实际的好坏无关)。
  给出所有芯片的测试结果,问哪些芯片是好芯片。

输入格式

  输入数据第一行为一个整数n,表示芯片个数。
  第二行到第n+1行为n*n的一张表,每行n个数据。表中的每个数据为0或1,在这n行中的第i行第j列(1≤i, j≤n)的数据表示用第i块芯片测试第j块芯片时得到的测试结果,1表示好,0表示坏,i=j时一律为1(并不表示该芯片对本身的测试结果。芯片不能对本身进行测试)。

输出格式

  按从小到大的顺序输出所有好芯片的编号

样例输入

3
1 0 1
0 1 0
1 0 1

样例输出

1 3

import java.io.*;
public class Main {
    public static void main(String[] args)throws Exception {
        BufferedReader bf=new BufferedReader(new InputStreamReader(System.in));
        int n=Integer.parseInt(bf.readLine());  
        int a[][]=new int[n][n];
        int b[]=new int[n*n];
        int i=0,j=0;

        for(i=0;i<n;i++){
            String s[]=bf.readLine().split(" ");
        for(j=0;j<n;j++){
            a[i][j]=Integer.parseInt(s[j]);
            if(a[i][j]==0)
                b[j]=b[j]+1;
    }
    }
        for(i=0;i<n;i++)

            if(b[i]<=n/2)
                System.out.print(i+1+" ");

}
}

FJ的字符串

问题描述

  FJ在沙盘上写了这样一些字符串:
  A1 = “A”
  A2 = “ABA”
  A3 = “ABACABA”
  A4 = “ABACABADABACABA”
  … …
  你能找出其中的规律并写所有的数列AN吗?

输入格式

  仅有一个数:N ≤ 26。

输出格式

  请输出相应的字符串AN,以一个换行符结束。输出中不得含有多余的空格或换行、回车符。

样例输入

3

样例输出

ABACABA

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {

    /**
     * @param args
     * @throws IOException 
     */
    public static void main(String[] args) throws IOException {
        BufferedReader bf=new BufferedReader(new InputStreamReader(System.in));
        String s=bf.readLine();
        int n=Integer.parseInt(s);
        String a="A";
        f(n,a,1);
    }

    private static void f(int n, String a, int i) {
        if(n==i){
            System.out.println(a);
            return;
        }
        else {
            a=a+String.valueOf((char)(i+65))+a;
            if(i==n){
                System.out.println(a);
            return;
            }
        }
        //while(i<n)
        f(n,a,i+1);
    }



}

Sine之舞

问题描述

  最近FJ为他的奶牛们开设了数学分析课,FJ知道若要学好这门课,必须有一个好的三角函数基本功。所以他准备和奶牛们做一个“Sine之舞”的游戏,寓教于乐,提高奶牛们的计算能力。
  不妨设
  An=sin(1–sin(2+sin(3–sin(4+…sin(n))…)
  Sn=(…(A1+n)A2+n-1)A3+…+2)An+1
  FJ想让奶牛们计算Sn的值,请你帮助FJ打印出Sn的完整表达式,以方便奶牛们做题。

输入格式

  仅有一个数:N<201。

输出格式

  请输出相应的表达式Sn,以一个换行符结束。输出中不得含有多余的空格或换行、回车符。

样例输入

3

样例输出

((sin(1)+3)sin(1–sin(2))+2)sin(1–sin(2+sin(3)))+1

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        String string = f(n, 1, 1);
        System.out.println(string);
    }

    private static String f1(int n, int i, int j) {
        if (i == n)
            return "sin(" + j + ")";
        if (i % 2 == 0)
            return "sin(" + i + "+" + f1(n, i + 1, j + 1) + ")";
        else
            return "sin(" + i + "-" + f1(n, i + 1, j + 1) + ")";
    }

    private static String f(int n, int i, int j) {
        if (i == n)
            return f1(n, i, j) + "+" + i;
        return "(" + f(n, i + 1, j) + ")" + f1(n, i, j) + "+" + i;
    }
}

数的读法

问题描述

  Tom教授正在给研究生讲授一门关于基因的课程,有一件事情让他颇为头疼:一条染色体上有成千上万个碱基对,它们从0开始编号,到几百万,几千万,甚至上亿。
  比如说,在对学生讲解第1234567009号位置上的碱基时,光看着数字是很难准确的念出来的。
  所以,他迫切地需要一个系统,然后当他输入12 3456 7009时,会给出相应的念法:
  十二亿三千四百五十六万七千零九
  用汉语拼音表示为
  shi er yi san qian si bai wu shi liu wan qi qian ling jiu
  这样他只需要照着念就可以了。
  你的任务是帮他设计这样一个系统:给定一个阿拉伯数字串,你帮他按照中文读写的规范转为汉语拼音字串,相邻的两个音节用一个空格符格开。
  注意必须严格按照规范,比如说“10010”读作“yi wan ling yi shi”而不是“yi wan ling shi”,“100000”读作“shi wan”而不是“yi shi wan”,“2000”读作“er qian”而不是“liang qian”。

输入格式

  有一个数字串,数值大小不超过2,000,000,000。

输出格式

  是一个由小写英文字母,逗号和空格组成的字符串,表示该数的英文读法。

样例输入

1234567009

样例输出

shi er yi san qian si bai wu shi liu wan qi qian ling jiu

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main{
    public static void main(String[] args) throws IOException {
        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
        String num = in.readLine();
        char[] ch = num.toCharArray();
        getRed(ch,num);
    }
    public static void getRed(char[] ch,String str){
        int numL01 = ch.length;
        String[] numR01 = new String[numL01];
        for(int a = 0;a < numL01;a++){
            numR01[a] = getNum(ch[a] + "");
        }
        int numL02 = 2 * numL01 - 1;
        String[] numR02 = new String[numL02];
        numR02[0] = numR01[0];
        int i01 = 10 - numL01;
        int i02 = 1;
        for(int a = 1;a < numL02;a++){
            if((a%2) == 0){
                numR02[a] = numR01[i02];
                i02++;
            }else{
                numR02[a] = getR(i01);
                i01++;
            }
        }
        String red = numR02[0];
        for(int a = 1;a < numL02;a++){
            if(a%2 == 0){
                if(red.endsWith("ling ")){
                    if(getT(numR02[a]))red += numR02[a];
                }else{
                    red += numR02[a];
                }
            }else{
                if(red.endsWith("ling ")){
                    if(getTR(numR02[a]))red = red.substring(0, red.length() - 5) + numR02[a];
                }else{
                    red += numR02[a];
                }
            }
        }
        if(red.endsWith("ling "))red = red.substring(0, red.length() - 5);
        if((str.length() > 8) 
                & (red.startsWith("yi shi "))){
            red = red.substring(3);
        }
        if(red.indexOf(" i wan ")!=-1){
            red = red.replaceFirst(" i wan ", " yi ");
        }else if(red.indexOf(" i ")!=-1){
            red = red.replaceFirst(" i ", " yi ");
        }
        if(str.length() == 6){
            if(red.indexOf("yi shi ")!=-1){
                red = red.replaceFirst("yi shi ", "shi ");
            }
        }
        System.out.println(red);
    }
    public static String getNum(String str){
        String[] num = {"ling ","yi ","er ","san ","si ","wu ","liu ","qi ","ba ","jiu "};
        str = num[Integer.parseInt(str)];
        return str;
    }
    public static String getR(int i){
        String[] red = {"shi ","i ","qian ","bai ","shi ","wan ","qian ","bai ","shi ",""};
        return red[i];
    }
    public static boolean getT(String str){
        String[] red = {"yi ","er ","san ","si ","wu ","liu ","qi ","ba ","jiu "};
        boolean num = false;
        for(int a = 0;a < red.length;a++){
            if(str.equals(red[a]))num = true;
            if(str.equals(red[a]))break;
        }
        return num;
    }
    public static boolean getTR(String str){
        boolean r = false;
        if((str.equals("wan ")) | (str.equals("i ")))r = true;
        return r;
    }
}


完美的代价

问题描述

  回文串,是一种特殊的字符串,它从左往右读和从右往左读是一样的。小龙龙认为回文串才是完美的。现在给你一个串,它不一定是回文的,请你计算最少的交换次数使得该串变成一个完美的回文串。
  交换的定义是:交换两个相邻的字符
  例如mamad
  第一次交换 ad : mamda
  第二次交换 md : madma
  第三次交换 ma : madam (回文!完美!)

输入格式

  第一行是一个整数N,表示接下来的字符串的长度(N <= 8000)
  第二行是一个字符串,长度为N.只包含小写字母

输出格式

  如果可能,输出最少的交换次数。
  否则输出Impossible

样例输入

5
mamad

样例输出

3

import java.io.*;

public class Main{
    public static void main(String args[]) throws IOException {
        BufferedReader buf = new BufferedReader(
                new InputStreamReader(System.in));
        int n = Integer.parseInt(buf.readLine());
        String s = buf.readLine();
        char c[] = s.toCharArray();
        int count = 0, num = 0;
        char ch = '0';
        int i, k = 0, j;
        int b[] = new int[26];
        for (i = 0; i < n; i++)
            for (i = 0; i < n; i++) {
                j = c[i] - 'a';
                b[j]++;
            }
        for (j = 0; j < 26; j++) {
            if (b[j] % 2 != 0) {
                k++;
                ch = (char) (j + 'a');
            }
        }
        if (k >= 2)
            System.out.println("Impossible");
        else
            System.out.println(changes(c, ch, n));
    }

    public static int changes(char s[], char x, int n) {
        int i, change = 0, j, k;
        for (i = 0; i < n / 2; i++) {
            if (s[i] == x) {
                for (j = i; j < n - i - 1; j++)
                    if (s[n - i - 1] == s[j])
                        break;
                change += j - i;
                for (k = j; k > i; k--)
                    s[k] = s[k - 1];
                s[i] = s[n - i - 1];
            } else {
                for (j = n - i - 1; j >= i; j--)
                    if (s[i] == s[j])
                        break;
                change += n - i - 1 - j;
                for (k = j; k < n - i - 1; k++)
                    s[k] = s[k + 1];
                s[n - i - 1] = s[i];
            }
        }
        return change;
    }
}

矩形面积交

问题描述

  平面上有两个矩形,它们的边平行于直角坐标系的X轴或Y轴。对于每个矩形,我们给出它的一对相对顶点的坐标,请你编程算出两个矩形的交的面积。

输入格式

  输入仅包含两行,每行描述一个矩形。
  在每行中,给出矩形的一对相对顶点的坐标,每个点的坐标都用两个绝对值不超过10^7的实数表示。

输出格式

  输出仅包含一个实数,为交的面积,保留到小数后两位。

样例输入

1 1 3 3
2 2 4 4

样例输出

1.00

import java.io.*;
public class Main
{
    public static void main(String[] args)throws IOException
    {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        double[][] arr = new double[2][4];

        String tag1[] = br.readLine().split(" ");
        String tag2[] = br.readLine().split(" ");

        for(int b=0;b<4;b++)
        {
            arr[0][b] = Double.valueOf(tag1[b]);
        }
        for(int b=0;b<4;b++)
        {
            arr[1][b] = Double.valueOf(tag2[b]);
        }

        double a,b,c,d,e,f,g,h;
        a = Math.max(arr[0][0],arr[0][2]);
        b = Math.min(arr[0][0],arr[0][2]);
        c = Math.max(arr[0][1],arr[0][3]);
        d = Math.min(arr[0][1],arr[0][3]);
        e = Math.max(arr[1][0],arr[1][2]);
        f = Math.min(arr[1][0],arr[1][2]);
        g = Math.max(arr[1][1],arr[1][3]);
        h = Math.min(arr[1][1],arr[1][3]);

        if(a<f || e<b || c<h || g<d)
        {
            System.out.println("0.00");
        }
        else
        {
            double i = (Math.min(a,e)-Math.max(b,f));
            double j = (Math.min(c,g)-Math.max(d,h));
            String s = String.format("%.2f",i*j);
            System.out.println(s);
        }
    }
}

矩阵乘法

问题描述

  给定一个N阶矩阵A,输出A的M次幂(M是非负整数)
  例如:
  A =
  1 2
  3 4
  A的2次幂
  7 10
  15 22

输入格式

  第一行是一个正整数N、M(1<=N<=30, 0<=M<=5),表示矩阵A的阶数和要求的幂数
  接下来N行,每行N个绝对值不超过10的非负整数,描述矩阵A的值

输出格式

  输出共N行,每行N个整数,表示A的M次幂所对应的矩阵。相邻的数之间用一个空格隔开

样例输入

2 2
1 2
3 4

样例输出

7 10
15 22

import java.io.*;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String str[] = br.readLine().split(" ");

        int Fir = Integer.parseInt(str[0]);
        int Sec = Integer.parseInt(str[1]);
        int[][] Mat = new int[Fir][Fir];
        int[][] MatPro = new int[Fir][Fir];
        for (int row_1 = 0; row_1 < Fir; row_1++) {
            String input[] = br.readLine().split(" ");
            for (int row_2 = 0; row_2 < Fir; row_2++) {
                Mat[row_1][row_2] = Integer.parseInt(input[row_2]);
            }
        }
        func(MatPro, Mat, Fir, Sec);
    }

    public static void func(int[][] MatPro, int[][] Mat, int a, int b) {
        int[][] tag = new int[a][a];
        for (int x = 0; x < a; x++) {
            for (int y = 0; y < a; y++) {
                tag[x][y] = Mat[x][y];
            }
        }

        if (b == 0) {
            for (int x = 0; x < a; x++) {
                for (int y = 0; y < a; y++) {
                    if (x == y) {
                        MatPro[x][y] = 1;
                    } else {
                        MatPro[x][y] = 0;
                    }
                    System.out.print(MatPro[x][y] + " ");
                }
                System.out.println();
            }
        }

        if (b != 0) {
            for (int p = 1; p < b; p++) {
                for (int x = 0; x < a; x++) {
                    for (int y = 0; y < a; y++) {
                        int pro = 0;
                        for (int z = 0; z < a; z++) {
                            pro += Mat[x][z] * tag[z][y];
                            MatPro[x][y] = pro;
                        }
                    }
                }
                for (int x = 0; x < a; x++) {
                    for (int y = 0; y < a; y++) {
                        tag[x][y] = MatPro[x][y];
                    }
                }
            }
            for (int x = 0; x < a; x++) {
                for (int y = 0; y < a; y++) {
                    System.out.print(tag[x][y] + " ");
                }
                System.out.println();
            }
        }
    }
}

分解质因数

问题描述

  求出区间[a,b]中所有整数的质因数分解。

输入格式

  输入两个整数a,b。

输出格式

  每行输出一个数的分解,形如k=a1*a2*a3…(a1<=a2<=a3…,k也是从小到大的)(具体可看样例)

样例输入

3 10

样例输出

3=3
4=2*2
5=5
6=2*3
7=7
8=2*2*2
9=3*3
10=2*5

提示

  先筛出所有素数,然后再分解。

数据规模和约定

  2<=a<=b<=10000

import java.io.*;
public class Main{
public static void main(String[] args)throws IOException{
   BufferedReader buf=new BufferedReader(new InputStreamReader(System.in));
      String s=buf.readLine();
    String str[]=s.split(" ");
    int i=Integer.parseInt(str[0]);
    int n=Integer.parseInt(str[1]);

    for(int j=i;j<=n;j++){
        StringBuffer b=new StringBuffer();
        b.append(j).append("=");
        int x=j;
        int y=(int)Math.sqrt(x);
        if(y<2){
            b.append(j);
            }
            else{
        for(int k=2;k<=y;k++){
            if(x%k==0){
                b.append(k).append("*");
                x=x/k;
                y=(int)Math.sqrt(x);
                k=1;

            }

        }
        b.append(x);
    }
        System.out.println(b.toString());
    }


}
}

字符串对比

问题描述

  给定两个仅由大写字母或小写字母组成的字符串(长度介于1到10之间),它们之间的关系是以下4中情况之一:
  1:两个字符串长度不等。比如 Beijing 和 Hebei
  2:两个字符串不仅长度相等,而且相应位置上的字符完全一致(区分大小写),比如 Beijing 和 Beijing
  3:两个字符串长度相等,相应位置上的字符仅在不区分大小写的前提下才能达到完全一致(也就是说,它并不满足情况2)。比如 beijing 和 BEIjing
  4:两个字符串长度相等,但是即使是不区分大小写也不能使这两个字符串一致。比如 Beijing 和 Nanjing
  编程判断输入的两个字符串之间的关系属于这四类中的哪一类,给出所属的类的编号。

输入格式

  包括两行,每行都是一个字符串

输出格式

  仅有一个数字,表明这两个字符串的关系编号

样例输入

BEIjing

    beiJing 

样例输出

3

import java.io.*;
public class Main {
    public static void main(String args[])throws Exception{
        BufferedReader buf = new BufferedReader(new InputStreamReader(System.in));
        String str1= null;String str2 = null;
        str1 = buf.readLine();
        str2 = buf.readLine();

        if(str1.length()==str2.length()){
            if(str1.equals(str2)){
                System.out.println(2);
            }else if(str1.equalsIgnoreCase(str2)){
                System.out.println(3);
            }else{
                System.out.println(4);
            }
        }else{
            System.out.println(1);
        }
    }
}

时间转换

问题描述

  给定一个以秒为单位的时间t,要求用“::”的格式来表示这个时间。表示时间,表示分钟,而表示秒,它们都是整数且没有前导的“0”。例如,若t=0,则应输出是“0:0:0”;若t=3661,则输出“1:1:1”。

输入格式

  输入只有一行,是一个整数t(0<=t<=86399)。

输出格式

  输出只有一行,是以“::”的格式所表示的时间,不包括引号。

样例输入

0

样例输出

0:0:0

样例输入

5436

样例输出

1:30:36

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;


public class Main {
    public static void main(String args[]) throws NumberFormatException, IOException{
        BufferedReader strin = new BufferedReader(new InputStreamReader(System.in));
        String st = strin.readLine();
        String str[]  = st.split(" ");
        long x = Integer.parseInt(str[0]);
        int h = (int)x/3600;
        int m = (int)x%3600/60;
        int s = (int)x%60;
        System.out.println(h+":"+m+":"+s);
    }
}

P0103

  从键盘输入一个大写字母,要求改用小写字母输出。
输入
  A
输出
  a

import java.io.*;
public class Main {
    public static void main(String[]args)throws Exception{
    BufferedReader sc=new BufferedReader(new InputStreamReader(System.in));
     String s=sc.readLine();
     int n=s.length();
     char ch[]=new char[n];
     for(int i=0;i<n;i++) {
         ch[i]=s.charAt(i);
         }
     for(int i=0;i<n;i++) {
    if(ch[i]>='A'&&ch[i]<='Z') {
        ch[i]+=32;
    }
    else {
        ch[i]-=32;
}}
    String s1=new String(ch);   
     System.out.println(s1);
}
}

表达式计算

问题描述

  输入一个只包含加减乖除和括号的合法表达式,求表达式的值。其中除表示整除。

输入格式

  输入一行,包含一个表达式。

输出格式

  输出这个表达式的值。

样例输入

1-2+3*(4-5)

样例输出

-4

数据规模和约定

  表达式长度不超过100,表达式运算合法且运算过程都在int内进行。

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder expression = new StringBuilder("(" + br.readLine() + ")"); // 表达式,在输入的表达式两边加上括号
        StringBuilder temp = new StringBuilder(); // 存放临时表达式,即每次存放的都是任意一个括号中的子表达式
        while (true) {
            int frontBrackets = expression.lastIndexOf("("); // 从表达式后边开始搜索,找到最后一个"("
            int backBrackets = expression.indexOf(")", frontBrackets); // 从最后一个"("的位置开始往后搜索,找到与之对应的")"
            if (frontBrackets == -1) {
                break; // 若再无表达式需要计算,即expression只有一个整数时,跳出循环
            }
            temp.append(expression.substring(frontBrackets + 1, backBrackets)); // 将此括号中的表达式存入temp
            expression.delete(frontBrackets, backBrackets + 1); // 在原始表达式中将括号连同其中的表达式删除
            for (int i = 0; i < temp.length(); i++) { // 从子表达式中找出运算符,根据运算原则,先乘除后加减
                if (temp.charAt(i) == '*') { // 若找到 "*" ,调用calculation进行运算
                    calculation(temp, '*', i);
                    i = 0; // 运算完后,i清零,方便下一次从开始位置继续寻找乘除运算符
                }
                if (temp.charAt(i) == '/') {
                    calculation(temp, '/', i);
                    i = 0;
                }
            }
            for (int i = 0; i < temp.length(); i++) { // 找完乘除运算符后,开始找加减运算符
                if (temp.charAt(i) == '+') {
                    calculation(temp, '+', i);
                    i = 0;
                }
                if (temp.charAt(i) == '-') {
                    calculation(temp, '-', i);
                    i = 0;
                }
            }
            expression.insert(frontBrackets, temp); // 运算完后,将结果插入在刚才删除的括号位置,构成新的表达式,继续循环计算
            temp.delete(0, temp.length()); // 将temp清空,方便下一个表达式计算
        }

        System.out.println(expression); // 输出结果
    }

    /**
     * 计算表达式
     * 
     * @param src
     *            表达式
     * @param op
     *            操作符
     * @param location
     *            操作符在表达式中的位置
     */
    private static void calculation(StringBuilder src, char op, int location) {
        int x = 0; // 操作数1
        int y = 0; // 操作数2
        int sum = 0;// sum = x (op) y
        String check = "0123456789+-"; // 检测运算符两边的内容是否为其中数组或者正数或负数
        StringBuilder temp = new StringBuilder(); // 存放运算符两边的字符
        if (location == 0)
            return; // 若遇到子表示其中只有加减运算符这种情况,且遇到的第一个运算符其实是想表示一个正数或者负数的符号,则函数返回,继续寻找下一个运算符

        int k = 0; // 搜索操作符左右两边的数
        for (k = location - 1; k >= 0 && check.contains(src.charAt(k) + ""); k--) { // 从运算符左边一个位置开始往前搜索,找到第一个操作数
            try {
                // 若数字前边有两个运算符,第一个是为了与前边的数相连,第二个是为了表示这个数的正负,则跳出循环,执行后面的语句
                // 比如:
                // 5+(7+-5*+10),搜索到5前边时,先搜索到"-",发现前边还有一个"+",此时temp中没有运算符,则继续执行,当搜索到"+"时,发现前边没有运算符了,就跳出循环
                if ((src.charAt(k) == '+' || src.charAt(k) == '-')
                        && (src.charAt(k - 1) != '+' || src.charAt(k - 1) != '-'))
                    break;
                if (temp.charAt(0) == '+' || temp.charAt(0) == '-')
                    break;

            } catch (Exception e) {
                // e.printStackTrace(); //不输出异常,满足题目输出要求
            }

            temp.insert(0, src.charAt(k)); // 每次都是从temp的开始位置插入内容,保证逆向搜索的内容能按照正常的顺序存入temp
            src.deleteCharAt(k); // 删除运算符前边的那个数字,若有正负号,也一并删除
        }

        x = Integer.parseInt(temp.toString()); // 将搜索到的此数存入x
        temp.delete(0, temp.length()); // 将temp清空

        for (k = k + 2; k < src.length() && check.contains(src.charAt(k) + "");) { // 从运算符右边一个位置开始往后搜索,找到第二个操作数,加2是因为上边的循环语句在结束时自减了一次

            if ((src.charAt(k) == '+' || src.charAt(k) == '-') && (temp.length() != 0))
                break;

            temp.append(src.charAt(k));
            src.deleteCharAt(k);
        }

        y = Integer.parseInt(temp.toString());
        temp.delete(0, temp.length());

        switch (op) {
        case '+':
            sum = x + y;
            src.deleteCharAt(k - 1); // 删除运算符
            src.insert(k - 1, sum + ""); // 将结果存入src的操作符位置(此时操作符两边的数已经从src中删除,所以插入此位置相当于用结果代替子表达式,方便下一次运算)
            break;

        case '-':
            sum = x - y;
            src.deleteCharAt(k - 1);
            src.insert(k - 1, sum + "");
            break;

        case '*':
            sum = x * y;
            src.deleteCharAt(k - 1);
            src.insert(k - 1, sum + "");
            break;

        case '/':
            sum = x / y;
            src.deleteCharAt(k - 1);
            src.insert(k - 1, sum + "");
            break;

        default:
            break;
        }
    }
}

数字三角形

问题描述

  (图3.1-1)示出了一个数字三角形。 请编一个程序计算从顶至底的某处的一条路
  径,使该路径所经过的数字的总和最大。
  ●每一步可沿左斜线向下或右斜线向下走;
  ●1<三角形行数≤100;
  ●三角形中的数字为整数0,1,…99;
  img.
  (图3.1-1)

输入格式

  文件中首先读到的是三角形的行数。
  接下来描述整个三角形

输出格式

  最大总和(整数)

样例输入

5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5

样例输出

30

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {

    public static void main(String[] args) throws NumberFormatException, IOException {
        BufferedReader br=new BufferedReader(
                new InputStreamReader(System.in));
        int n=Integer.parseInt(br.readLine().trim()),i,j;
        int[][] arr=new int[n][n];
        arr[0][0]=Integer.parseInt(br.readLine().trim());
        for(i=1;i<n;i++){
            String[] str=br.readLine().trim().split(" ");
            for(j=0;j<=i;j++){
                arr[i][j]=Integer.parseInt(str[j]);
            }
        }
        for(i=n-2;i>=0;i--){
            for(j=0;j<=i;j++){
                if(arr[i+1][j]>arr[i+1][j+1]) arr[i][j]+=arr[i+1][j];
                else arr[i][j]+=arr[i+1][j+1];
            }
        }
        System.out.println(arr[0][0]);
    }

}

未名湖边的烦恼

问题描述

  每年冬天,北大未名湖上都是滑冰的好地方。北大体育组准备了许多冰鞋,可是人太多了,每天下午收工后,常常一双冰鞋都不剩。
  每天早上,租鞋窗口都会排起长龙,假设有还鞋的m个,有需要租鞋的n个。现在的问题是,这些人有多少种排法,可以避免出现体育组没有冰鞋可租的尴尬场面。(两个同样需求的人(比如都是租鞋或都是还鞋)交换位置是同一种排法)

输入格式

  两个整数,表示m和n

输出格式

  一个整数,表示队伍的排法的方案数。

样例输入

3 2

样例输出

5

数据规模和约定

  m,n∈[0,18]
  问题分析

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;


public class Main {
    public static void main(String[] args) throws IOException{
        BufferedReader burf = new BufferedReader(new InputStreamReader(System.in));
        String[] s = burf.readLine().split(" ");
        int m = Integer.parseInt(s[0]);
        int n = Integer.parseInt(s[1]);
        System.out.println(func(m,n));
    }
    public static int func(int m,int n){
        if(n==0)
            return 1;
        if(m<n)
            return 0;
        return func(m-1,n)+func(m,n-1);
    }
}

图形显示

问题描述

  编写一个程序,首先输入一个整数,例如5,然后在屏幕上显示如下的图形(5表示行数):
  * * * * *
  * * * *
  * * *
  * *
  *

import java.io.BufferedReader;
import java.io.InputStreamReader;

public class Main {

    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int number = Integer.valueOf(br.readLine());
        for (int i = 0; i < number; i++) {
            for (int j = i; j < number; j++) {
                if (i != number - 1)
                    System.out.print("* ");
                else
                    System.out.print("*");
            }
            System.out.println();
        }
    }

}

排序

问题描述

  编写一个程序,输入3个整数,然后程序将对这三个整数按照从大到小进行排列。
  输入格式:输入只有一行,即三个整数,中间用空格隔开。
  输出格式:输出只有一行,即排序后的结果。
  输入输出样例

样例输入

9 2 30

样例输出

30 9 2

import java.io.*;
import java.util.Arrays;
public class Main {

    public static void main(String[] args) throws IOException {
        BufferedReader str=new BufferedReader(new InputStreamReader(System.in));
        String s=str.readLine();
        String[] s1=s.split(" ");
        int n=s1.length;
        int[] arr=new int[n];
        for(int i=0;i<n;i++){
             arr[i]=Integer.parseInt(s1[i]);
        }
        Arrays.sort(arr);
        for(int j=n-1;j>=0;j--){
            System.out.print(arr[j]+" ");
        }
    }

}

出现次数最多的整数

问题描述
  编写一个程序,读入一组整数,这组整数是按照从小到大的顺序排列的,它们的个数N也是由用户输入的,最多不会超过20。然后程序将对这个数组进行统计,把出现次数最多的那个数组元素值打印出来。如果有两个元素值出现的次数相同,即并列第一,那么只打印比较小的那个值。
  输入格式:第一行是一个整数NN £ 20;接下来有N行,每一行表示一个整数,并且按照从小到大的顺序排列。
  输出格式:输出只有一行,即出现次数最多的那个元素值。
输入输出样例

样例输入

5
100
150
150
200
250

样例输出

150

import java.io.*;

public class Main { 
    public static void main(String[] args) {
        try{
            BufferedReader br=new BufferedReader(new InputStreamReader(System.in),1);       
                String line=br.readLine();
                int n=Integer.parseInt(line);
                if(n>0){
                int[][] num=new int[2][n];
                int max=1,maxn=0;
                for(int i=0;i<n;i++){
                    line=br.readLine();
                    num[0][i]=Integer.parseInt(line);
                    int g=1;
                    for(int j=i-1;j>=0;j--)
                        if(num[0][j]==num[0][i]){
                            g=num[1][j]+1;
                            break;
                        }
                    num[1][i]=g;
                    if(g>max){
                        max=g;
                        maxn=i;
                    }
                }
                System.out.println(num[0][maxn]);
                }else System.out.println("");
        }catch(Exception e){
            System.out.println("Message:"+e.getMessage());
        }
    }

}

字串统计

问题描述

  给定一个长度为n的字符串S,还有一个数字L,统计长度大于等于L的出现次数最多的子串(不同的出现可以相交),如果有多个,输出最长的,如果仍然有多个,输出第一次出现最早的。

输入格式

  第一行一个数字L。
  第二行是字符串S。
  L大于0,且不超过S的长度。

输出格式

  一行,题目要求的字符串。
  输入样例1:
  4
  bbaabbaaaaa
  输出样例1:
  bbaa
  输入样例2:
  2
  bbaabbaaaaa
  输出样例2:
  aa

数据规模和约定

  n<=60
  S中所有字符都是小写英文字母。

提示

  枚举所有可能的子串,统计出现次数,找出符合条件的那个

import java.io.*;
class Main 
{
    public static void main(String[] args) throws Exception
    {
        BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
        int A =Integer.parseInt(bf.readLine());
        String s = bf.readLine().toLowerCase();
        char c []=s.toCharArray();
        int ok_number = 0;
        String ok_s0="",ok_s="";
        if (A<=60 && A>0 && A<c.length){
            char ok_char[] =new char[c.length];
            int max=1,m=1;
            ok_s=""+c[0];
            ok_char[A]='\0';
            int a=0;int MAX=1;a=A;
            for (a=A;a<c.length;a++)
            {
                for (int i=0;i<c.length-a ;i++ )
                {
                    for (int j = i+1;j<=c.length-a ;j++ )
                    {
                        for (int k=0;k<a ;k++ )
                        {
                            if (c[i+k]==c[j+k])
                            {
                                ok_char[ok_number]=c[i+k];
                                ok_number++;
                            }
                        }
                        if (ok_number==a)
                        {
                            m++;
                            ok_s0= new String(ok_char,0,a);

                        }
                        ok_number=0;
                    }
                    if (max<m)
                    {
                        max=m;
                        s = ok_s0;
                    }
                    m=1;
                }
                if (MAX<=max)
                {
                    MAX=max;
                    ok_s=s;
                }
                max=1;
            }
            System.out.print(ok_s);
        }
    }
}

矩阵乘法

问题描述

  输入两个矩阵,分别是m*s,s*n大小。输出两个矩阵相乘的结果。

输入格式

  第一行,空格隔开的三个正整数m,s,n(均不超过200)。
  接下来m行,每行s个空格隔开的整数,表示矩阵A(i,j)。
  接下来s行,每行n个空格隔开的整数,表示矩阵B(i,j)。

输出格式

  m行,每行n个空格隔开的整数,输出相乘後的矩阵C(i,j)的值。

样例输入

2 3 2
1 0 -1
1 1 -3
0 3
1 2
3 1

样例输出

-3 2
-8 2
提示
矩阵C应该是m行n列,其中C(i,j)等于矩阵A第i行行向量与矩阵B第j列列向量的内积。
例如样例中C(1,1)=(1,0,-1)(0,1,3) = 1 0 +0*1+(-1)*3=-3

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {

    public static int m,s,n;
    public static int[][]a;
    public static int[][]b;
    public static int[][]c;
    public static boolean input() throws IOException{
        BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
        String str=br.readLine();
        String[] strArr=str.split(" ");
        if(strArr.length<3) return false;
        m=Integer.parseInt(strArr[0]);
        s=Integer.parseInt(strArr[1]);
        n=Integer.parseInt(strArr[2]);
        if(m<1||s<1||n<1) return false; 
        a=new int[m][s];
        b=new int[s][n];
        c=new int[m][n];

        String[] str_a=new String[m];               
        for(int i=0;i<m;i++){
            str_a[i]=br.readLine();
            String [] m_s_arr=str_a[i].split(" ");
            for(int j=0;j<s;j++){
                a[i][j]=Integer.parseInt(m_s_arr[j]);
            }
        }
        String[] str_b=new String[s];
        for(int i=0;i<s;i++){
            str_b[i]=br.readLine();
            String[] s_n_arr=str_b[i].split(" ");
            for(int j=0;j<n;j++){
                b[i][j]=Integer.parseInt(s_n_arr[j]);
            }
        }   
        return true;
    }
    public static void cal(){
        for(int i=0;i<m;i++){
            for(int j=0;j<n;j++){
                    int sum=0;              
                    for(int k=0;k<s;k++){
                        sum+=a[i][k]*b[k][j];
                    }   
                    c[i][j]=sum;
            }
        }
    }

    public static void print(){
        for(int i=0;i<m;i++){
            for(int j=0;j<n;j++){
                System.out.print(c[i][j]+"  ");
            }
            System.out.println();       
        }       
    }
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        try {
            if(input()){
                cal();
                print();
            }
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

大小写转换

问题描述
  编写一个程序,输入一个字符串(长度不超过20),然后把这个字符串内的每一个字符进行大小写变换,即将大写字母变成小写,小写字母变成大写,然后把这个新的字符串输出。
  输入格式:输入一个字符串,而且这个字符串当中只包含英文字母,不包含其他类型的字符,也没有空格。
  输出格式:输出经过转换后的字符串。
输入输出样例

样例输入

AeDb

样例输出

aEdB

import java.io.*;
public class Main {
    public static void main(String[] args)throws Exception{
        BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
        String s=br.readLine();
        int n=s.length();
        char ch[]=new char[n];
        for(int i=0;i<n;i++){
            ch[i]=s.charAt(i);
        }
        for(int i=0;i<n;i++){
            if(ch[i]>='A'&&ch[i]<='Z'){
                ch[i]+=32;
            }else{
                ch[i]-=32;
            }
        }
        String s1=new String(ch);
        System.out.println(s1);
    }
}

删除数组零元素

从键盘读入n个整数放入数组中,编写函数CompactIntegers,删除数组中所有值为0的元素,其后元素向数组首端移动。注意,CompactIntegers函数需要接受数组及其元素个数作为参数,函数返回值应为删除操作执行后数组的新元素个数。输出删除后数组中元素的个数并依次输出数组元素。
样例输入: (输入格式说明:5为输入数据的个数,3 4 0 0 2 是以空格隔开的5个整数)
5 
3 4 0 0 2
样例输出:(输出格式说明:3为非零数据的个数,3 4 2 是以空格隔开的3个非零整数)
3
3 4 2
样例输入: 
7
0 0 7 0 0 9 0
样例输出:
2
7 9
样例输入: 
3
0 0 0
样例输出:
0
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class Main {

    public void input() {

        Scanner cin =new Scanner(System.in);
        int n = cin.nextInt();
        int [] num =new int[n];
        int [] num1 =new int[n];
        int j=0;
        for(int i=0;i<n;i++){
            num1[i]=cin.nextInt();
            if(num1[i]!=0){
                num[j++]=num1[i];
            }
        }
        System.out.println(j);
        if(j>0){
            for(int i=0;i<j;i++)
            System.out.print(num[i]+" ");
        }
        System.out.println();
    }

    public static void main(String[] args) {
        new Main().input();
    }

}

寻找数组中最大值

问题描述

  对于给定整数数组a[],寻找其中最大值,并返回下标。

输入格式

  整数数组a[],数组元素个数小于1等于100。输出数据分作两行:第一行只有一个数,表示数组元素个数;第二行为数组的各个元素。

输出格式

  输出最大值,及其下标

样例输入

3
3 2 1

样例输出

3 0
import java.io.*;
public class Main {

    public static void main(String[] args) throws Exception {
        // TODO Auto-generated method stub
        BufferedReader bf=new BufferedReader(new InputStreamReader(System.in));
        int n=Integer.parseInt(bf.readLine());
        int []a=new int[n];
        String str=bf.readLine();
        String []s=new String[n];
        s=str.split(" ");
        for(int i=0;i<n;i++){
            a[i]=Integer.parseInt(s[i]);
        }
        int max=a[0];
        int index=0;
        for(int j=0;j<n;j++){
            if(a[j]>max){
                max=a[j];
                index=j;
            }
        }
        System.out.print(max+" "+index);
    }

}

安慰奶牛

问题描述

Farmer John变得非常懒,他不想再继续维护供奶牛之间供通行的道路。道路被用来连接N个牧场,牧场被连续地编号为1到N。每一个牧场都是一个奶牛的家。FJ计划除去P条道路中尽可能多的道路,但是还要保持牧场之间 的连通性。你首先要决定那些道路是需要保留的N-1条道路。第j条双向道路连接了牧场Sj和Ej(1 <= Sj <= N; 1 <= Ej <= N; Sj != Ej),而且走完它需要Lj的时间。没有两个牧场是被一条以上的道路所连接。奶牛们非常伤心,因为她们的交通系统被削减了。你需要到每一个奶牛的住处去安慰她们。每次你到达第i个牧场的时候(即使你已经到过),你必须花去Ci的时间和奶牛交谈。你每个晚上都会在同一个牧场(这是供你选择的)过夜,直到奶牛们都从悲伤中缓过神来。在早上 起来和晚上回去睡觉的时候,你都需要和在你睡觉的牧场的奶牛交谈一次。这样你才能完成你的 交谈任务。假设Farmer John采纳了你的建议,请计算出使所有奶牛都被安慰的最少时间。

输入格式

第1行包含两个整数N和P。

接下来N行,每行包含一个整数Ci。

接下来P行,每行包含三个整数Sj, Ej和Lj。

输出格式

输出一个整数, 所需要的总时间(包含和在你所在的牧场的奶牛的两次谈话时间)。

样例输入

5 7
10
10
20
6
30
1 2 5
2 3 5
2 4 12
3 4 17
2 5 15
3 5 6

样例输出

176

数据规模与约定

5 <= N <= 10000,N-1 <= P <= 100000,0 <= Lj <= 1000,1 <= Ci <= 1,000。

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.StringTokenizer;

class Reader3{
    static BufferedReader reader;
    static StringTokenizer tokenizer;

    static void init(InputStream input){
        reader=new BufferedReader(new InputStreamReader(input));
        tokenizer=new StringTokenizer("");
    }

    static String next() throws IOException{
        while (!tokenizer.hasMoreElements()) {
            tokenizer = new StringTokenizer(reader.readLine(
));
        }
        return tokenizer.nextToken();
    }

    static int nextInt() throws IOException{
        return Integer.parseInt(next());
    }
    static double nextDouble() throws IOException{
        return Double.parseDouble(next());
    }
}
class KruskalDui{
    int a,b,l;
}
public class Main{

    /**
     * @param args
     * @throws IOException 
     */
    static int father[]=new int[100000];
    static ArrayList<KruskalDui> path =new ArrayList<KruskalDui>();

    public static int getfather(int x) {
        if (x!=father[x]) {
            father[x]=getfather(father[x]);
        }
        return father[x];
    }
    public static void _qst_w(int l,int r)  {  
        int i=l,j=r,mw=path.get((i+j)/2).l;  
        while(i<=j){  
            while(path.get(i).l<mw) i++;  
            while(path.get(j).l>mw) j--;  
            if(i<=j){  
                Collections.swap(path,i,j);  
                i++;j--;  
            }  
        }  
        if(l<j) _qst_w(l,j);  
        if(i<r) _qst_w(i,r);  
    }  
    public static void main(String[] args) throws IOException {
        // TODO Auto-generated method stub
        Reader3.init(System.in);
        int n=Reader3.nextInt();
        int p=Reader3.nextInt();
        int d[]=new int [n+1];
        int minD=Integer.MAX_VALUE;
        for (int i = 1; i < n+1; i++) {
            d[i]=Reader3.nextInt();
            father[i]=i;
            if (d[i]<minD) {
                minD=d[i];
            }
        }
        for (int i = 0; i < p; i++) {
            KruskalDui k=new KruskalDui();
            k.a=Reader3.nextInt();
            k.b=Reader3.nextInt();
            k.l=Reader3.nextInt();
            k.l=k.l*2+d[k.a]+d[k.b];
            path.add(k);
        }
        _qst_w(0,p-1);
        int fx,fy,result=minD,count=0,k=0;
        while(count<n-1){
            fx=getfather(path.get(k).a);  
            fy=getfather(path.get(k).b);  
            if(fx!=fy){  
                father[fx]=fy;  
                result+=path.get(k).l;  
                count++;  
            }  
            k++;
        }
        System.out.println(result);
    }
}

最短路

问题描述

给定一个n个顶点,m条边的有向图(其中某些边权可能为负,但保证没有负环)。请你计算从1号点到其他点的最短路(顶点从1到n编号)。

输入格式

第一行两个整数n, m。

接下来的m行,每行有三个整数u, v, l,表示u到v有一条长度为l的边。

输出格式

共n-1行,第i行表示1号点到i+1号点的最短路。

样例输入

3 3
1 2 -1
2 3 -1
3 1 2

样例输出

-1
-2

数据规模与约定

对于10%的数据,n = 2,m = 2。

对于30%的数据,n <= 5,m <= 10。

对于100%的数据,1 <= n <= 20000,1 <= m <= 200000,-10000 <= l <= 10000,保证从任意顶点都能到达其他所有顶点。

import java.io.*;
import java.util.*;
class Main
{
    static int n,m;
    static int[] u;
    static int[] v;
    static int[] w;
    static int[] d;
    static int[] first;
    static int[] next;
    static Queue<Integer> q=new LinkedList<Integer>();
    static boolean[] inq; 
    public static void main(String[] args) throws IOException
    {
        int i;
        BufferedReader bfr=new BufferedReader(new InputStreamReader(System.in));
        String str = bfr.readLine();
        String[] s = str.split("\\s");
        n=Integer.parseInt(s[0]);
        m=Integer.parseInt(s[1]);
        n++;
        m++;
        u=new int[m];
        v=new int[m];
        w=new int[m];
        first=new int[n];
        next=new int[m];
        d=new int[n];
        inq=new boolean[n];    
        for(i=1;i<n;i++) 
            first[i]=-1;
        for(i=1;i<m;i++)
        {
            str = bfr.readLine();
            s = str.split(" ");
            u[i]=Integer.parseInt(s[0]);
            v[i]=Integer.parseInt(s[1]);
            w[i]=Integer.parseInt(s[2]);
            next[i]=first[u[i]];
            first[u[i]]=i;
        }
        spfa(1);
        for(i=2;i<n;i++)   
            System.out.println(d[i]);
    }
    public static void spfa(int s)
    {
        int i,x;
        for(i=2;i<n;i++) 
            d[i]=Integer.MAX_VALUE;
        q.offer(s); 
        while(!q.isEmpty())
        {
            x=q.poll();
            inq[x]=false;        
            for(i=first[x];i!=-1;i=next[i])
                if(d[v[i]]>d[x]+w[i])
                {
                    d[v[i]]=d[x]+w[i];
                    if(!inq[v[i]])
                    {
                        inq[v[i]]=true;
                        q.offer(v[i]);
                    }
                }
        }
    }
}

最大最小公倍数

问题描述

​ 已知一个正整数N,问从1~N中任选出三个数,他们的最小公倍数最大可以为多少。

输入格式

​ 输入一个正整数N。

输出格式

​ 输出一个整数,表示你找到的最小公倍数。

样例输入

​ 9

样例输出

​ 504

数据规模与约定

​ 1 <= N <= 106。

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;

public class Main{
        public static long gcdivisor(long a,long b)
    {
        long m=1;
        if(a<b)
        {
            m=a;
            a=b;
            b=m;
        }
        while(m!=0)
        {
            m=a%b;
            a=b;
            b=m;
        }
        return a;
    }

    public static void main(String args[]) throws IOException{
        BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
        long n=Long.parseLong(br.readLine());
        if(n%2==1)
                   System.out.println(n*(n-1)*(n-2));
        else
        {
            if(gcdivisor(n,n-3)!=1)
              System.out.println((n-1)*(n-2)*(n-3));
            else
            {   
              System.out.println(n*(n-1)*(n-3));   
        }
    }
}
}

黑色星期五

问题描述
  有些西方人比较迷信,如果某个月的13号正好是星期五,他们就会觉得不太吉利,用古人的说法,就是“诸事不宜”。请你编写一个程序,统计出在某个特定的年份中,出现了多少次既是13号又是星期五的情形,以帮助你的迷信朋友解决难题。
  说明:(1)一年有365天,闰年有366天,所谓闰年,即能被4整除且不能被100整除的年份,或是既能被100整除也能被400整除的年份;(2)已知1998年1月1日是星期四,用户输入的年份肯定大于或等于1998年。
  输入格式:输入只有一行,即某个特定的年份(大于或等于1998年)。
  输出格式:输出只有一行,即在这一年中,出现了多少次既是13号又是星期五的情形。
输入输出样例

样例输入

1998

样例输出

3



import java.util.Scanner;



public class Main {
    public static boolean runnian(int year)
    {
        if((year%4==0&&year%100!=0)||(year%400==0))
            return true;
        else return false;

    }
    public  static int total(int year)
    {
        int total=0;
        int years=0;
        int count=0;
        if(year<2000)
            years=(year-1998)*365;
                else
        years=(((year-2000)/4)+1)*366+(year-1998-(((year-2000)/4)+1))*365;
                if(runnian(year))
                    years=((year-2000)/4)*366+(year-1998-((year-2000)/4))*365;

        int mouth []=new  int []{0,31,0,31,30,31,30,31,31,30,31,30,31};
        if(runnian(year))
            mouth[2]=29;
        else mouth[2]=28;
        for(int i=1;i<=12;i++)
        {
            if((years+mouth[i-1]+13-4)%7==5)
                        {
                            count++;
                        }
                         years=years+mouth[i-1];
        }
        return count;


    }
    public static void main(String[] args) {
      Scanner in=new Scanner(System.in);
      int year=in.nextInt();
      int i=total(year);
      System.out.println(i);


    }

}

阿尔法乘积

问题描述

  计算一个整数的阿尔法乘积。对于一个整数x来说,它的阿尔法乘积是这样来计算的:如果x是一个个位数,那么它的阿尔法乘积就是它本身;否则的话,x的阿尔法乘积就等于它的各位非0的数字相乘所得到的那个整数的阿尔法乘积。例如:4018224312的阿尔法乘积等于8,它是按照以下的步骤来计算的:
  4018224312 → 4*1*8*2*2*4*3*1*2 → 3072 → 3*7*2 → 42 → 4*2 → 8
  编写一个程序,输入一个正整数(该整数不会超过6,000,000),输出它的阿尔法乘积。
  输入格式:输入只有一行,即一个正整数。
  输出格式:输出相应的阿尔法乘积。
  输入输出样例

样例输入

4018224312

样例输出

8

import java.io.BufferedReader;
import java.io.InputStreamReader;

public class Main{

    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String number = br.readLine();
        if (number.equals("0"))
            System.out.println(number);
        else {
            while (number.length() > 1) {
                int sum = 1;
                char[] temp = number.toCharArray();
                for (int i = 0; i < temp.length; i++) {
                    if (temp[i] == '0')
                        continue;
                    sum *= temp[i] - 48;
                }
                number = sum + "";
            }
            System.out.println(number);
        }
    }

}

整除问题

问题描述

  编写一个程序,输入三个正整数min、max和factor,然后对于min到max之间的每一个整数(包括min和max),如果它能被factor整除,就把它打印出来。
  输入格式:输入只有一行,包括三个整数min、max和factor。
  输出格式:输出只有一行,包括若干个整数。
  输入输出样例

样例输入

1 10 3

样例输出

3 6 9

import java.io.BufferedReader;
import java.io.InputStreamReader;

public class Main {
    public static void main(String args[])throws Exception{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String[] temp = br.readLine().split(" ");
        int min = Integer.parseInt(temp[0]), max = Integer.parseInt(temp[1]),
                divi = Integer.parseInt(temp[2]);
        for(int i=min; i<=max; i++)
            if(i%divi==0)
                System.out.print(i+" ");
    }
}

水仙花

  水仙花数

问题描述

  判断给定的三位数是否 水仙花 数。所谓 水仙花 数是指其值等于它本身 每位数字立方和的数。例 153 就是一个 水仙花 数。 153=13+53+33

输入格式

  一个整数。

输出格式

  是水仙花数,输出”YES”,否则输出”NO”(不包括引号)

样例输入

123

样例输出

NO

数据规模和约定

  一个三位的整数,否则输出”NO”

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {

    public static void main(String[] args) throws IOException{
    String str;
    int num,sd,td,hd;
    BufferedReader buf;
    buf=new BufferedReader(new InputStreamReader(System.in));
    str = buf.readLine();
    num=Integer.parseInt(str);
        hd=num/100;
        td=num/10%10;
        sd=num%10;
        if(num==hd*hd*hd+td*td*td+sd*sd*sd)
        {
            System.out.println("YES");
        }else{
            System.out.println("NO");
        }
    }
    }



输出米字形

根据输入的正整数n (1  米字形由一个(2n-1)*(2n-1)的矩阵组成,矩阵包含从大写A开始的n个字母
  例如:n=3时,包含A,B,C;n=4时,包含A,B,C,D。
  矩阵的正中间为n个字母中字典序最大的那个,从这个字母开始,沿着西北、正北、东北、正西、正东、西南、正南、东南八个方向各有一条由大写字母组成的直线。并且直线上的字母按字典序依次减小,直到大写字母A。
  矩阵的其它位置用英文句号.填充。

  样例输入一
  3

  样例输出一
  A.A.A
  .BBB.
  ABCBA
  .BBB.
  A.A.A

  样例输入二
  4

  样例输出二
  A..A..A
  .B.B.B.
  ..CCC..
  ABCDCBA
  ..CCC..
  .B.B.B.
  A..A..A

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main{

    public static void main(String[] args) throws IOException {

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        int n = Integer.parseInt(br.readLine());

        String str = "";
        for (int i = 0; i < n; i++)
            str += (char) (i + 65);
        for (int i = n - 2; i > -1; i--)
            str += (char) (i + 65);

        int len = n * 2 - 1;

        char[][] chs = new char[len][len];

        int y = len - 1;
        for (int i = 0; i < chs.length; i++) {
            chs[i][i] = str.charAt(i);
            chs[i][y--] = str.charAt(i);
            chs[len / 2][i] = str.charAt(i);
            chs[i][len / 2] = str.charAt(i);
        }

        for (int i = 0; i < chs.length; i++) {
            for (int j = 0; j < chs[i].length; j++) {
                if(!(chs[i][j]>='A' && chs[i][j]<='Z'))
                    chs[i][j] = '.';
            }
        }

        for (int i = 0; i < chs.length; i++) {
            for (int j = 0; j < chs[i].length; j++) {
                System.out.print(chs[i][j]);
            }
            System.out.println();
        }
    }
}

快速排序

问题描述

  快速排序是最经常使用的一种排序方式,对于给定的n个数组成的一个数组,请使用快速排序对其进行排序。
  现给定一序列,请用快速排序将其按升序排序并输出。

输入格式

  第一行一个数N。
  第2~N+1行每行一个数,表示给定序列。

输出格式

  共N行,每行一个数,表示所求序列。

样例输入

5
1
4
2
3
4

样例输出

1
2
3
4
4

数据规模和约定

  共10组数据。
  对100%的数据,N<=10^5,所有数均为非负数且在int范围内。

public class Main {
    public static void main(String args[]){
        System.out.println("Yes");
    }
}

删除多余括号

问题描述

  从键盘输入一个含有括号的四则运算表达式,要求去掉可能含有的多余的括号,结果要保持原表达式中变量和运算符的相对位置不变,且与原表达式等价,不要求化简。另外不考虑’+’  ‘-‘用作正负号的情况,即输入表达式不会出现(+a)或(-a)的情形。

输入格式

  表达式字符串,长度不超过255,  并且不含空格字符。表达式中的所有变量都是单个小写的英文字母, 运算符只有加+减-乘*除/等运算符号。

输出格式

  去掉多余括号后的表达式

样例输入

样例一:
a+(b+c)-d
样例二:
a+b/(c+d)
样例三:
(a*b)+c/d
样例四:
((a+b)*f)-(i/j)

样例输出

样例一:
a+b+c-d
样例二:
a+b/(c+d)
样例三:
a*b+c/d
样例四:
(a+b)*f-i/j
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;

public class Main{
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        char[] chs = br.readLine().toCharArray();
        List<Character> list = new ArrayList<Character>();
        for (int i = 0; i < chs.length; i++) {
            list.add(chs[i]);
        }
        String s = "";
        for (int i = 0; i < func(list).size(); i++) {
            s += list.get(i);
        }
        System.out.println(s);
    }

    public static List<Character> func(List<Character> list) {
        for (int i = 0; i < list.size(); i++) {
            if (list.get(i) == '+' || list.get(i) == '-') {
                if (list.get(i - 1) == ')' && list.get(i + 1) == '(') {
                    list.remove(i - 1);
                    list.remove(i);
                    for (int j = i - 1; j > -1; j--) {
                        if (list.get(j) == '(') {
                            list.remove(j);
                            break;
                        }
                    }
                    for (int k = i + 1; k < list.size(); k++) {
                        if (list.get(k) == ')') {
                            list.remove(k);
                            break;
                        }
                    }
                }
                if (list.get(i - 1) == ')') {
                    list.remove(i - 1);
                    for (int j = i - 1; j > -1; j--) {
                        if (list.get(j) == '(') {
                            list.remove(j);
                            break;
                        }
                    }
                }
                if (list.get(i + 1) == '(') {
                    if (list.get(i) == '+')
                        for (int k = i + 1; k < list.size(); k++) {
                            if (list.get(k) == ')' && !list.contains('/')
                                    && !list.contains('*')) {
                                list.remove(k);
                                list.remove(i + 1);
                                break;
                            }
                        }
                }
            }
        }
        return list;
    }
}

薪水计算

问题描述

  编写一个程序,计算员工的周薪。薪水的计算是以小时为单位,如果在一周的时间内,员工工作的时间不超过40 个小时,那么他/她的总收入等于工作时间乘以每小时的薪水。如果员工工作的时间在40 到50 个小时之间,那么对于前40 个小时,仍按常规方法计算;而对于剩余的超额部分,每小时的薪水按1.5 倍计算。如果员工工作的时间超过了50 个小时,那么对于前40 个小时,仍按常规方法计算;对于40~50 个小时之间的部分,每小时的薪水按1.5 倍计算;而对于超出50 个小时的部分,每小时的薪水按2 倍计算。请编写一个程序,输入员工的工作时间和每小时的薪水,然后计算并显示他/她应该得到的周薪。
  输入格式:输入只有一行,包括一个整数和一个实数,分别表示工作时间和每小时薪水。
  输出格式:输出只有一个实数,表示周薪,保留小数点后2位。
  输入输出样例

样例输入

40 50

样例输出

2000.00

import java.math.BigDecimal;
import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        String a=sc.next();
        String b=sc.next();
        double t= Double.parseDouble(a);
        double m= Double.parseDouble(b);
        double sum=0;
        if(t==0||m==0)
        System.out.println("0.00");
        else
        if(0<t&&t<=40)
        {
            sum=t*m;
            BigDecimal bd = new BigDecimal(sum);
            bd = bd.setScale(2,BigDecimal.ROUND_HALF_UP);  
            System.out.println(bd);
        }
        else
        if(t<=50)
        {   sum=40*m+(t-40)*m*1.5;
        BigDecimal bd = new BigDecimal(sum);
        bd = bd.setScale(2,BigDecimal.ROUND_HALF_UP);  
        System.out.println(bd);
        }
        else
        {   
            sum=40*m+10*1.5*m+(t-50)*m*2;
            BigDecimal bd = new BigDecimal(sum);
            bd = bd.setScale(2,BigDecimal.ROUND_HALF_UP);  
            System.out.println(bd);
        }
    }
}

明明的随机数

问题描述

  明明想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他先用计算机生成了N个1到1000之间的随机整数(N≤100),对于其中重复的数字,只保留一个,把其余相同的数去掉,不同的数对应着不同的学生的学号。然后再把这些数从小到大排序,按照排好的顺序去找同学做调查。请你协助明明完成“去重”与“排序”的工作。

输入格式

  输入有2行,第1行为1个正整数,表示所生成的随机数的个数:
  N
  第2行有N个用空格隔开的正整数,为所产生的随机数。

输出格式

  输出也是2行,第1行为1个正整数M,表示不相同的随机数的个数。第2行为M个用空格隔开的正整数,为从小到大排好序的不相同的随机数。

样例输入

10
20 40 32 67 40 20 89 300 400 15

样例输出

8
15 20 32 40 67 89 300 400

题目来源

  计13李震摘编自NOIP06PJ01

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;


public class Main {

    public static void main(String[] args) throws NumberFormatException, IOException {
        // TODO Auto-generated method stub
        BufferedReader br =new BufferedReader(new InputStreamReader(System.in));
        int n=Integer.parseInt(br.readLine());
        int[] arr =new int[n];
        String[] strTem=br.readLine().split(" ");
        for(int i=0;i<n;i++){
            arr[i]=Integer.parseInt(strTem[i]);
        }   
        ArrayList<Integer> arrList=new ArrayList<Integer>();
        arrList.add(arr[0]);
        for(int i=1;i<n;i++){
            for(int j=0;j<arrList.size();j++){
                if(arr[i]==arrList.get(j))
                    break;
                if(arr[i]!=arrList.get(j)&&j==arrList.size()-1){
                    arrList.add(arr[i]);
                }
            }
        }
        int num=arrList.size();
        System.out.println(num);

        int[] tem=new int[num]; 

        for(int i=0;i<num;i++){
            tem[i]=arrList.get(i);
        }
        Arrays.sort(tem);
        for(int i=0;i<num;i++){
            System.out.print(tem[i]+" ");
        }

    }

}

求最大值

问题描述

  给n个有序整数对ai bi,你需要选择一些整数对 使得所有你选定的数的ai+bi的和最大。并且要求你选定的数对的ai之和非负,bi之和非负。

输入格式

  输入的第一行为n,数对的个数
  以下n行每行两个整数 ai bi

输出格式

  输出你选定的数对的ai+bi之和

样例输入

5
-403 -625
-847 901
-624 -708
-293 413
886 709

样例输出

1715

数据规模和约定

  1<=n<=100
  -1000<=ai,bi<=1000

import java.util.*;
public class Main{
    public static void main(String[] args) {
        int max=0,aa=0, bb=0;
        boolean k=true;
        Scanner in=new Scanner(System.in);
        int n=in.nextInt();
        int[] ai=new int[n];
        int[] bi=new int[n];
        for(int i=0;i<n;i++){
            ai[i]=in.nextInt();
            bi[i]=in.nextInt();
        }
        for(int i=0;i<n-1;i++){
            for(int j=0;j<n-1;j++){
                if((ai[j]+bi[j])<(ai[j+1]+bi[j+1])){
                    aa=ai[j];
                    ai[j]=ai[j+1];
                    ai[j+1]=aa;
                    bb=bi[j];
                    bi[j]=bi[j+1];
                    bi[j+1]=bb;
                }
            }
        }
        for(int i=0;i<n-1;i++){
            for(int j=0;j<n-1;j++){
                if(k==true){
                    if((ai[i]+bi[i])>=0||(ai[j+1]+bi[j+1])>=0){
                        if((ai[i]+ai[j+1]>=0) && (bi[i]+bi[j+1]>=0)){
                            aa=ai[i]+ai[j+1];
                            bb=bi[i]+bi[j+1];
                            max=aa+bb;
                            ai[i]=0;
                            ai[j+1]=0;
                            bi[i]=0;
                            bi[j+1]=0;
                            k=false;
                        }
                    }
                }
                else if((ai[j+1]+bi[j+1])>=0 ){
                    if( (ai[j+1]+aa>=0) && bi[j+1]+bb>=0){
                        aa+=ai[j+1];
                        bb+=bi[j+1];
                        max+=ai[j+1]+bi[j+1];
                        ai[j+1]=0;
                        bi[j+1]=0;
                    }
                }   
            }
        }
        System.out.print(max);
    }

}

日期计算

问题描述

  已知2011年11月11日是星期五,问YYYY年MM月DD日是星期几?注意考虑闰年的情况。尤其是逢百年不闰,逢400年闰的情况。

输入格式

  输入只有一行
  YYYY MM DD

输出格式

  输出只有一行
  W

数据规模和约定

  1599 <= YYYY <= 2999
  1 <= MM <= 12
  1 <= DD <= 31,且确保测试样例中YYYY年MM月DD日是一个合理日期
  1 <= W <= 7,分别代表周一到周日

样例输入

2011 11 11

样例输出

5

import java.util.Scanner;

class Main {
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Scanner input = new Scanner(System.in);
        int y = input.nextInt();
        int m = input.nextInt();
        int d = input.nextInt();
        int i, j, k, s1 = 0, s2 = 0, x = 0, s, z = 0;
        for (i = 1; i < 2011; i++) {
            s1 = s1 + 365;
            if ((i % 4 == 0 && i % 100 != 0) || (i % 400 == 0)) {
                s1++;
            }
        }
        s1 = s1 + 315;

        for (j = 1; j < y; j++) {
            s2 = s2 + 365;
            if ((j % 4 == 0 && j % 100 != 0) || (j % 400 == 0)) {
                s2++;
            }
        }

        for (i = 1; i < m; i++) {
            if(i==1)
                s2=s2+31;
            if(i==2)
                {s2=s2+28;
                if((y % 4 == 0 && y % 100 != 0) || (y % 400 == 0))
                {s2++;}
                }
            if(i==3)
                s2=s2+31;
            if(i==4)
                s2=s2+30;
            if(i==5)
                s2=s2+31;
            if(i==6)
                s2=s2+30;
            if(i==7)
                s2=s2+31;
            if(i==8)
                s2=s2+31;
            if(i==9)
                s2=s2+30;
            if(i==10)
                s2=s2+31;
            if(i==11)
                s2=s2+30;

        }



        s2 = s2 + d;

        s = s2 - s1;
        if (s < 0) {
            s = 0 - s;
            z = 1;
        }
        if (z == 0) {
            x = (s % 7) + 5;
            if (s % 7 > 2) {
                x = x % 7;
            }
        } else if (z == 1) {
            x = 5 - (s % 7);
            if (s % 7 == 5)
                x = 7;
            if (s % 7 == 6)
                x = 6;
        }
        System.out.println(x);
    }

}

9-1九宫格

问题描述

  九宫格。输入1-9这9个数字的一种任意排序,构成3*3二维数组。如果每行、每列以及对角线之和都相等,打印1。否则打印0。

样例输出

与上面的样例输入对应的输出。
例:
img

数据规模和约定

  输入1-9这9个数字的一种任意排序。

import java.util.Scanner;

public class Main {

    public static boolean IsEqual(int[][] num){
        boolean flag = true;
        int sum = 0;
        int tmp = 0;
        for ( int i = 0 ; i < 3 ; i++){
            sum += num[0][i];
        }
        for ( int i = 1 ; i < 3 ; i++){
            tmp = 0;
            for ( int j = 0 ; j < 3 ; j++){
                tmp += num[i][j];
            }
            if ( tmp == sum){
                continue;
            }else{
                flag = false;
                break;
            }
        }
        if ( flag == true){
            for ( int i = 0 ; i < 3 ; i++){
                tmp = 0;
                for ( int j = 0 ; j < 3 ;j++){
                    tmp += num[j][i];
                }
                if ( tmp == sum){
                    continue;
                }else{
                    flag = false;
                    break;
                }
            }
        }else{
            return flag;
        }
        if ( flag == true){
            tmp = 0;
            for ( int i = 0 ; i < 3 ; i++){
                tmp += num[i][i];
            }
            if ( tmp != sum){
                flag = false;
            }else{
                flag = true;
            }
        }else{
            return flag;
        }
        if ( flag == true){
            tmp = 0;
            for ( int i = 0 ; i < 3 ; i++){
                tmp += num[2-i][i];
            }
            if ( tmp == sum){
                flag = true;
            }else{
                flag = false;
            }
        }
        return flag;
    }

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Scanner in = new Scanner(System.in);
        int[][] num = new int[3][3];
        for ( int i = 0 ; i < 3 ; i++){
            for ( int j =  0 ; j < 3 ; j++){
                num[i][j] = in.nextInt();
            }
        }
        if (IsEqual(num) == true){
            System.out.println(1);
        }else{
            System.out.println(0);
        }

        in.close();
    }

}

9-2 文本加密

问题描述

  先编写函数EncryptChar,按照下述规则将给定的字符c转化(加密)为新的字符:”A”转化”B”,”B”转化为”C”,… …”Z”转化为”a”,”a”转化为”b”,… …, “z”转化为”A”,其它字符不加密。编写程序,加密给定字符串。

样例输出

与上面的样例输入对应的输出。
例:
img

数据规模和约定

  输入数据中每一个数的范围。
  例:50个字符以内无空格字符串。

import java.io.BufferedReader;
import java.io.InputStreamReader;

public class Main {

    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        char[] s = br.readLine().toCharArray();
        br.close();
        for (int i = 0; i <s.length; i++) {
            s[i] = EncryptChar(s[i]);
        }
        System.out.println(s);
    }
    public static char  EncryptChar(char c){

        if((c >= 'a' && c<'z' ) || (c>='A'&& c<'Z')){
            c= (char) (c+1);
        }
        else if(c=='z'){
            c ='A';
        }else if(c=='Z'){
            c ='a';
        }

        return c;
    }
}

分考场

问题描述

  n个人参加某项特殊考试。
  为了公平,要求任何两个认识的人不能分在同一个考场。
  求是少需要分几个考场才能满足条件。

输入格式

  第一行,一个整数n(1

import java.util.Scanner;

public class Main {
    static int[][] room = new int[101][101];    //教室,有两个属性,分别为教室编号和教室已有学生的数量
    static int[] cnt = new int[101];    //表示i教室已有学生的总数量
    static int[][] graph;
    static int n = 0, m = 0, ans = 9999999; //学生数目,边

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        n = in.nextInt();   //学生编号从1开始
        m = in.nextInt();
        graph = new int[n + 1][n + 1];
        for(int i = 0; i < m; i ++) {
            int v1 = in.nextInt();
            int v2 = in.nextInt();
            graph[v1][v2] = 1;
            graph[v2][v1] = 1;  //无向图
        }
        dfs(1, 0);  //当前学生ID,当前教室编号
        System.out.println(ans);
    }

    private static void dfs(int id, int num) {
        if(num >= ans) {
            return;
        }

        if(id > n) {    //所有考生分配完毕  
            ans = Math.min(ans, num);
            return;
        }

        for(int i = 1; i <= num; i ++) {  //判断该学生是否可以在之前存在的教室
            int jiShu = 0;  //得到的是在该考场中和这个人不认识的人数  
            for(int j = 1; j <= cnt[i]; j ++) {
                if(graph[id][room[i][j]] == 0) {
                    jiShu ++;
                }
            }
            if(jiShu == cnt[i]) {   //证明这个人与该考场中的所有学生均不认识
                cnt[i] ++;  //这个人直接进入该考场
                room[i][cnt[i]] = id;
                dfs(id + 1, num);   //递归下一位学生
                cnt[i] --;  //回溯,尝试另一种方案,答案是找到最小考场数目
            }
        }
        //开辟新考场
        cnt[num + 1] ++;
        room[num + 1][cnt[num + 1]] = id;
        dfs(id + 1, num + 1);
        cnt[num + 1] --;    //回溯
    }

}