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

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

/**
* 偶数求和
Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 87871    Accepted Submission(s): 37068


Problem Description
有一个长度为n(n<=100)的数列,该数列定义为从2开始的递增有序偶数,
现在要求你按照顺序每m个数求出一个平均值,如果最后不足m个,则以实际数量求平均值。编程输出该平均值序列。


Input
输入数据有多组,每组占一行,包含两个正整数n和m,n和m的含义如上所述。


Output
对于每组输入数据,输出一个平均值序列,每组输出占一行。


Sample Input

3 2
4 2



Sample Output

3 6
3 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): 38870


Problem Description
输入n(n<100)个数,找出其中最小的数,将它与最前面的数交换后输出这些数。



Input
输入数据有多组,每组占一行,每行的开始是一个整数n,表示这个测试实例的数值的个数,
跟着就是n个整数。n=0表示输入的结束,不做处理。


Output
对于每组输入数据,输出交换后的数列,每组输出占一行。


Sample Input
4 2 1 3 4
5 5 4 3 2 1
0


Sample Output
1 2 3 4
1 4 3 2 5


Author
lcy


Source
C语言程序设计练习(三) 


 */

代码演示:

package ac;
//AC
import 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): 44659


Problem Description
对于给定的一个字符串,统计其中数字字符出现的次数。


Input
输入数据有多行,第一行是一个整数n,表示测试实例的个数,后面跟着n行,每行包括一个由字母和数字组成的字符串。


Output
对于每个测试实例,输出该串中数值的个数,每个输出占一行。


Sample Input
2
asdfasdf123123asdfasdf
asdf111111111asdfasdfasdf


Sample Output
6
9
 */

代码演示:

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): 41082


Problem Description
有一头母牛,它每年年初生一头小母牛。每头小母牛从第四个年头开始,每年年初也生一头小母牛。
请编程实现在第n年的时候,共有多少头母牛?


Input
输入数据由多个测试实例组成,每个测试实例占一行,包括一个整数n(0<n<55),n的含义如题目中描述。
n=0表示输入数据的结束,不做处理。


Output
对于每个测试实例,输出在第n年的时候母牛的数量。
每个输出占一行。


Sample Input
2
4
5
0


Sample Output
2
4
6

  */

代码演示:

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): 37361


Problem Description
有n(n<=100)个整数,已经按照从小到大顺序排列好,现在另外给一个整数x,请将该数插入到序列中,并使新的序列仍然有序。


Input
输入数据包含多个测试实例,每组数据由两行组成,第一行是n和m,第二行是已经有序的n个数的数列。
n和m同时为0标示输入数据的结束,本行不做处理。


Output
对于每个测试实例,输出插入新的元素后的数列。


Sample Input
3 3
1 2 4
0 0


Sample Output
1 2 3 4


Author
lcy

 */

代码演示(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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值