【ACM】P2015(*)、P2016、P2017、P2018(*)、P2019代码演示

来源:互联网 发布:vmware12安装ubuntu 编辑:程序博客网 时间:2024/05/29 14:15

[P2015问题概述]:偶数求和

/*** 偶数求和Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 87871    Accepted Submission(s): 37068Problem Description有一个长度为n(n<=100)的数列,该数列定义为从2开始的递增有序偶数,现在要求你按照顺序每m个数求出一个平均值,如果最后不足m个,则以实际数量求平均值。编程输出该平均值序列。Input输入数据有多组,每组占一行,包含两个正整数n和m,n和m的含义如上所述。Output对于每组输入数据,输出一个平均值序列,每组输出占一行。Sample Input3 24 2Sample Output3 63 7 *  */

代码演示(参考):

package ac;import java.util.Scanner;public class P2015{    public static void main(String[] args){        Scanner scanner=new Scanner(System.in);        while(scanner.hasNextInt()){            int n=scanner.nextInt();            int m=scanner.nextInt();            int number=0,sum=0,x=2;            if(n%m!=0){                number=n/m+1;            }            else{                number=n/m;            }            int[]s=new int[number];            if(n%m==0){                for(int i=0;i<number;i++){                    for(int j=0;j<m;j++){                        sum+=x;                        x=x+2;                    }                    s[i]=sum/m;                    sum=0;                }            }            else{                for(int i=0;i<number;i++){                    if(i==number-1){                        for(int j=0;j<(n%m);j++){                            sum+=x;                            x=x+2;                        }                        s[i]=sum/(n%m);                    }                    else{                        for(int j=0;j<m;j++){                            sum+=x;                            x=x+2;                        }                        s[i]=sum/m;                    }                    sum=0;                }            }            for(int i=0;i<number;i++){                if(i==number-1) System.out.println(s[i]);                else System.out.print(s[i]+" ");            }        }    }}

[P2016问题概述]:数据的交换输出

/** * 数据的交换输出Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 103988    Accepted Submission(s): 38870Problem Description输入n(n<100)个数,找出其中最小的数,将它与最前面的数交换后输出这些数。Input输入数据有多组,每组占一行,每行的开始是一个整数n,表示这个测试实例的数值的个数,跟着就是n个整数。n=0表示输入的结束,不做处理。Output对于每组输入数据,输出交换后的数列,每组输出占一行。Sample Input4 2 1 3 45 5 4 3 2 10Sample Output1 2 3 41 4 3 2 5AuthorlcySourceC语言程序设计练习(三)  */

代码演示:

package ac;//ACimport java.util.Scanner;public class P2016 {    public static void main(String[] args) {        Scanner sc=new Scanner(System.in);        while(sc.hasNext()){            //输入n            int n=sc.nextInt();            if(n==0 ){                break;            }            //创建接收数据的a数组            int[]a=new int[n];            for(int i=0;i<a.length;i++){                a[i]=sc.nextInt();            }            //找到最小值所在的位置            int min=a[0];            int k=0;            for(int i=0;i<a.length;i++){                if(a[i]<min){                    min=a[i];                    k=i;                }            }            //交换位置            int temp=a[0];            a[0]=a[k];            a[k]=temp;            //遍历出数组            for(int i=0;i<a.length;i++){                if(i==0){                    System.out.print(a[i]);                }else{                    System.out.print(" "+a[i]);                }            }            System.out.println();        }    }}

[P2017问题概述]:字符串统计

/** * 字符串统计Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 81324    Accepted Submission(s): 44659Problem Description对于给定的一个字符串,统计其中数字字符出现的次数。Input输入数据有多行,第一行是一个整数n,表示测试实例的个数,后面跟着n行,每行包括一个由字母和数字组成的字符串。Output对于每个测试实例,输出该串中数值的个数,每个输出占一行。Sample Input2asdfasdf123123asdfasdfasdf111111111asdfasdfasdfSample Output69 */

代码演示:

package ac;import java.util.Scanner;public class P2017 {    public static void main(String[] args) {        Scanner sc=new Scanner(System.in);        int n=sc.nextInt();        while(n-->0){            String str=sc.next();            char[] chs=str.toCharArray();            int count=0;            for(int i=0;i<chs.length;i++){                if(chs[i]>='0'&&chs[i]<='9'){                    count++;                }            }            System.out.println(count);        }    }}

[P2018问题概述]:母牛的故事

/***  * 母牛的故事Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 82698    Accepted Submission(s): 41082Problem Description有一头母牛,它每年年初生一头小母牛。每头小母牛从第四个年头开始,每年年初也生一头小母牛。请编程实现在第n年的时候,共有多少头母牛?Input输入数据由多个测试实例组成,每个测试实例占一行,包括一个整数n(0<n<55),n的含义如题目中描述。n=0表示输入数据的结束,不做处理。Output对于每个测试实例,输出在第n年的时候母牛的数量。每个输出占一行。Sample Input2450Sample Output246  */

代码演示:

import java.util.Scanner;public class P2018 {    public static void main(String[] args) {        //打表---用打表的方式将所有年份的数目都求解出来。        int a[] = new int[55];        a[1]=1;        a[2]=2;        a[3]=3;        a[4]=4;        for(int i=5;i<55;i++){            a[i]=a[i-1]+a[i-3];        }        //输入年份,找到其对应的数目        Scanner sc = new Scanner(System.in);        while(sc.hasNext()){            int n = sc.nextInt();            if(n==0){                break;            }            System.out.println(a[n]);        }    }}

[P2019问题概述]: 数列有序

/** * 数列有序!Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 88953    Accepted Submission(s): 37361Problem Description有n(n<=100)个整数,已经按照从小到大顺序排列好,现在另外给一个整数x,请将该数插入到序列中,并使新的序列仍然有序。Input输入数据包含多个测试实例,每组数据由两行组成,第一行是n和m,第二行是已经有序的n个数的数列。n和m同时为0标示输入数据的结束,本行不做处理。Output对于每个测试实例,输出插入新的元素后的数列。Sample Input3 31 2 40 0Sample Output1 2 3 4Authorlcy */

代码演示(1):

package ac;import java.util.Arrays;import java.util.Scanner;public class P2019{    public static void main(String[] args) {        Scanner sc=new Scanner(System.in);        while(sc.hasNext()){            int n=sc.nextInt();            int m=sc.nextInt();            if(n==0 && m==0){                break;            }            int[] a=new int[n+1];            for(int i=0;i<a.length-1;i++){                a[i]=sc.nextInt();            }            a[a.length-1]=m;            Arrays.sort(a);            println(a);        }    }    //打印数组    private static void println(int[] a) {        for(int i=0;i<a.length;i++){            if(i==0){                System.out.print(a[i]);            }else{                System.out.print(" "+a[i]);            }        }        System.out.println();    }}

代码演示(2):复杂方式

package ac;import java.util.Scanner;public class P2019 {    public static void main(String[] args) {        Scanner sc=new Scanner(System.in);        while(sc.hasNext()){            int n=sc.nextInt();            int m=sc.nextInt();            if(n==0 && m==0){                break;            }            int[] a=new int[n];            for(int i=0;i<n;i++){                a[i]=sc.nextInt();            }            dichotomySort(a, m);            System.out.println();        }    }    //打印数组    public static void print(int[] arr){        for(int i=0;i<arr.length;i++){            if(i==0){                System.out.print(arr[i]);            }else{                System.out.print(" "+arr[i]);            }        }    }    //二分法插入排序    public static void  dichotomySort(int[] arr,int m){        int[] temp=new int[arr.length+1];        int high=arr.length-1;        int low=0;        while(low<=high){            int mid=(high+low)/2;            if(m>arr[mid]){                low=mid+1;            }else{                high=mid-1;            }        }        //System.out.println("high="+high+"low="+low);        for(int i=0;i<temp.length;i++){            if(i<low){                temp[i]=arr[i];            }else if(i==low){                temp[i]=m;            }else{                temp[i]=arr[i-1];            }        }        print(temp);    }}
0 0