首页 > 其他分享 >ACM_SQNU_2022_5练习赛

ACM_SQNU_2022_5练习赛

时间:2022-11-30 23:36:45浏览次数:55  
标签:练习赛 2022 int 样例 Scanner SQNU str public charAt

打印 ASCII 码

题目描述

输入一个除空格以外的可见字符,输出其 ASCII 码。

输入格式

一个除空格以外的可见字符。

输出格式

一个十进制整数,即该字符的 ASCII 码。

样例 #1

样例输入 #1

A

样例输出 #1

65

解题代码

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
    	Scanner sc = new Scanner(System.in);
    	String ch = sc.next();
        System.out.println((int)ch.charAt(0));
    }
}

小鱼比可爱

题目描述

人比人,气死人;鱼比鱼,难死鱼。小鱼最近参加了一个“比可爱”比赛,比的是每只鱼的可爱程度。参赛的鱼被从左到右排成一排,头都朝向左边,然后每只鱼会得到一个整数数值,表示这只鱼的可爱程度,很显然整数越大,表示这只鱼越可爱,而且任意两只鱼的可爱程度可能一样。由于所有的鱼头都朝向左边,所以每只鱼只能看见在它左边的鱼的可爱程度,它们心里都在计算,在自己的眼力范围内有多少只鱼不如自己可爱呢。请你帮这些可爱但是鱼脑不够用的小鱼们计算一下。

输入格式

第一行输入一个正整数 $n$,表示鱼的数目。

第二行内输入 $n$ 个正整数,用空格间隔,依次表示从左到右每只小鱼的可爱程度 $a_i$。

输出格式

一行,输出 $n$ 个整数,用空格间隔,依次表示每只小鱼眼中有多少只鱼不如自己可爱。

样例 #1

样例输入 #1

6
4 3 0 5 1 2

样例输出 #1

0 0 0 3 1 2

代码

import java.util.Scanner;
 
public class Main {
	public static void main(String[] args) {
		Scanner sc =new Scanner(System.in);
		int n = sc.nextInt();
		int [] num = new int [n];
		for (int i = 0; i < num.length; i++) {
			num[i]=sc.nextInt();
			int a = num[i];
			int count=0;
			for (int j = 0; j <i; j++) {
				if(a>num[j]) {
					count++;
				}
			}
			
			System.out.print(count+" ");
		}
		
	}
 
}

手机

题目描述

一般的手机的键盘是这样的:

要按出英文字母就必须要按数字键多下。例如要按出 x 就得按 9 两下,第一下会出 w,而第二下会把 w 变成 x。0 键按一下会出一个空格。

你的任务是读取若干句只包含英文小写字母和空格的句子,求出要在手机上打出这个句子至少需要按多少下键盘。

输入格式

一行句子,只包含英文小写字母和空格,且不超过 200 个字符。

输出格式

一行一个整数,表示按键盘的总次数。

样例 #1

样例输入 #1

i have a dream

样例输出 #1

23

代码

import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String str = sc.nextLine();
        int count =0;
        for (int i = 0; i < str.length(); i++) {
            if (str.charAt(i)=='a'||str.charAt(i)=='d'||str.charAt(i)=='g'||str.charAt(i)=='j'
                    ||str.charAt(i)=='m'||str.charAt(i)=='p'||str.charAt(i)=='t'
                    ||str.charAt(i)=='w'){
                count++;
            }
            else if (str.charAt(i)=='b'||str.charAt(i)=='e'||str.charAt(i)=='h'||str.charAt(i)=='k'
                    ||str.charAt(i)=='n'||str.charAt(i)=='q'||str.charAt(i)=='u'
                    ||str.charAt(i)=='x'){
                count+=2;
            }
            else if (str.charAt(i)=='c'||str.charAt(i)=='f'||str.charAt(i)=='i'||str.charAt(i)=='l'
                    ||str.charAt(i)=='o'||str.charAt(i)=='r'||str.charAt(i)=='v'
                    ||str.charAt(i)=='y'){
                count+=3;
            }
            else if (str.charAt(i)=='s'||str.charAt(i)=='z'){
                count+=4;
            }
            else {
                count++;
            }
        }
        System.out.print(count);
    }
}

开灯

题目描述

在一条无限长的路上,有一排无限长的路灯,编号为 $1,2,3,4,\dots$。

每一盏灯只有两种可能的状态,开或者关。如果按一下某一盏灯的开关,那么这盏灯的状态将发生改变。如果原来是开,将变成关。如果原来是关,将变成开。

在刚开始的时候,所有的灯都是关的。小明每次可以进行如下的操作:

指定两个数,$a,t$($a$ 为实数,$t$ 为正整数)。将编号为 $\lfloor a\rfloor,\lfloor 2 \times a\rfloor,\lfloor3 \times a\rfloor,\dots,\lfloor t \times a\rfloor$ 的灯的开关各按一次。其中 $\lfloor k \rfloor$ 表示实数 $k$ 的整数部分。

在小明进行了 $n$ 次操作后,小明突然发现,这个时候只有一盏灯是开的,小明很想知道这盏灯的编号,可是这盏灯离小明太远了,小明看不清编号是多少。

幸好,小明还记得之前的 $n$ 次操作。于是小明找到了你,你能帮他计算出这盏开着的灯的编号吗?

输入格式

第一行一个正整数 $n$,表示 $n$ 次操作。

接下来有 $n$ 行,每行两个数,$a_i,t_i$。其中 $a_i$ 是实数,小数点后一定有 $6$ 位,$t_i$ 是正整数。

输出格式

仅一个正整数,那盏开着的灯的编号。

样例 #1

样例输入 #1

3
1.618034 13
2.618034 7
1.000000 21

样例输出 #1

20

代码

import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int sum = 0;
        while(n>0){
            double a = sc.nextDouble();
            int t = sc.nextInt();
            for (int i = 1; i <= t; i++) {
                int x = (int)(a*i);
                sum^=x;//异或,sum与x相同则取0,不同则取sum;
            }
            n--;
        }
        System.out.print(sum);
    }
}

[NOIP2016 普及组] 买铅笔

题目背景

NOIP2016 普及组 T1

题目描述

P 老师需要去商店买 $n$ 支铅笔作为小朋友们参加 NOIP 的礼物。她发现商店一共有 $3$ 种包装的铅笔,不同包装内的铅笔数量有可能不同,价格也有可能不同。为了公平起 见,P 老师决定只买同一种包装的铅笔。

商店不允许将铅笔的包装拆开,因此 P 老师可能需要购买超过 $n$ 支铅笔才够给小朋友们发礼物。

现在 P 老师想知道,在商店每种包装的数量都足够的情况下,要买够至少 $n$ 支铅笔最少需要花费多少钱。

输入格式

第一行包含一个正整数 $n$,表示需要的铅笔数量。

接下来三行,每行用 $2$ 个正整数描述一种包装的铅笔:其中第 $1$ 个整数表示这种包装内铅笔的数量,第 $2$ 个整数表示这种包装的价格。

保证所有的 $7$ 个数都是不超过 $10000$ 的正整数。

输出格式

$1$ 个整数,表示 P 老师最少需要花费的钱。

样例 #1

样例输入 #1

57
2 2
50 30
30 27

样例输出 #1

54

样例 #2

样例输入 #2

9998
128 233
128 2333
128 666

样例输出 #2

18407

样例 #3

样例输入 #3

9999
101 1111
1 9999
1111 9999

样例输出 #3

89991

提示

铅笔的三种包装分别是:

  • $2$ 支装,价格为 $2$;
  • $50$ 支装,价格为 $30$;
  • $30$ 支装,价格为 $27$。

P老师需要购买至少 $57$ 支铅笔。

如果她选择购买第一种包装,那么她需要购买 $29$ 份,共计 $2 \times 29 = 58$ 支,需要花费的钱为 $2 \times 29 = 58$。

实际上,P 老师会选择购买第三种包装,这样需要买 $2$ 份。虽然最后买到的铅笔数量更多了,为 $30 \times 2 = 60$ 支,但花费却减少为 $27 \times 2 = 54$,比第一种少。

对于第二种包装,虽然每支铅笔的价格是最低的,但要够发必须买 $2$ 份,实际的花费达到了 $30 \times 2 = 60$,因此 P 老师也不会选择。

所以最后输出的答案是 $54$。

【数据范围】

保证所有的 $7$ 个数都是不超过 $10000$ 的正整数。

【子任务】

子任务会给出部分测试数据的特点。如果你在解决题目中遇到了困难,可以尝试只解决一部分测试数据。

每个测试点的数据规模及特点如下表:

上表中“整倍数”的意义为:若为 $K$,表示对应数据所需要的铅笔数量 $n$ —定是每种包装铅笔数量的整倍数(这意味着一定可以不用多买铅笔)。

代码

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner in=new Scanner(System.in);
		double n=in.nextDouble();
		int a[]=new int[3];
		int b[]=new int[3];
		for (int i=0;i<3;i++) {
			a[i]=in.nextInt();
			b[i]=in.nextInt();
		}
		int x=(int)Math.ceil(n/a[0]);
		int y=(int)Math.ceil(n/a[1]);
		int z=(int)Math.ceil(n/a[2]);
		int sx=x*b[0];
		int sy=y*b[1];
		int sz=z*b[2];
		System.out.println(Math.min(sx, Math.min(sy, sz)));
	}
}

[NOIP2015 普及组] 金币

题目背景

NOIP2015 普及组 T1

题目描述

国王将金币作为工资,发放给忠诚的骑士。第一天,骑士收到一枚金币;之后两天(第二天和第三天),每天收到两枚金币;之后三天(第四、五、六天),每天收到三枚金币;之后四天(第七、八、九、十天),每天收到四枚金币……;这种工资发放模式会一直这样延续下去:当连续 $n$ 天每天收到 $n$ 枚金币后,骑士会在之后的连续 $n+1$ 天里,每天收到 $n+1$ 枚金币。

请计算在前 $k$ 天里,骑士一共获得了多少金币。

输入格式

一个正整数 $k$,表示发放金币的天数。

输出格式

一个正整数,即骑士收到的金币数。

样例 #1

样例输入 #1

6

样例输出 #1

14

样例 #2

样例输入 #2

1000

样例输出 #2

29820

提示

【样例 1 说明】

骑士第一天收到一枚金币;第二天和第三天,每天收到两枚金币;第四、五、六天,每天收到三枚金币。因此一共收到 $1+2+2+3+3+3=14$ 枚金币。

对于 $100%$ 的数据,$1\le k\le 10^4$。

代码

import java.util.Scanner;

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

        Scanner sc = new Scanner(System.in);
        int k = sc.nextInt();   //问 k 天一共多少金币
        int n = 1;  //第 n 天
        int g = 0;  //一共 g 个金币
        int i = 1;  //一天 i 个金币

        //一天发 i 个金币,发 i 天,
        while(n < k+1){
            int n0 = 1; //发 i 个金币的第 n0 天
            while(n0 < i+1 ){
                    g = g + i;  //金币总数增加 i
                    n0++;
                    n++;    //当前天数 n 加1
                    if(n==k+1){
                        break;
                    }
            }
            i++;
            if(n==k+1){
                break;
            }
        }
        System.out.println(g);
    }
}

[NOIP2013 普及组] 计数问题

题目描述

试计算在区间 $1$ 到 $n$ 的所有整数中,数字 $x$($0\le x\le9$)共出现了多少次?例如,在 $1$ 到 $11$ 中,即在 $1,2,3,4,5,6,7,8,9,10,11$ 中,数字 $1$ 出现了 $4$ 次。

输入格式

$2$ 个整数 $n,x$,之间用一个空格隔开。

输出格式

$1$ 个整数,表示 $x$ 出现的次数。

样例 #1

样例输入 #1

11 1

样例输出 #1

4

提示

对于 $100%$ 的数据,$1\le n\le 10^6$,$0\le x \le 9$。

代码

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int a = sc.nextInt();
        int b = sc.nextInt();
        int count=0;
        for (int i = 1; i <= a; i++) {
            String[] str = (i + "").split("");//注意
            for (int j = 0; j < str.length; j++) {
                if (str[j].equals(String.valueOf(b))){   //注意字符串不能和数字比
                    count++;
                }
            }
        }
        System.out.println(count);
    }
}

[NOIP2007 普及组] 奖学金

题目描述

某小学最近得到了一笔赞助,打算拿出其中一部分为学习成绩优秀的前 $5$ 名学生发奖学金。期末,每个学生都有 $3$ 门课的成绩:语文、数学、英语。先按总分从高到低排序,如果两个同学总分相同,再按语文成绩从高到低排序,如果两个同学总分和语文成绩都相同,那么规定学号小的同学 排在前面,这样,每个学生的排序是唯一确定的。

任务:先根据输入的 $3$ 门课的成绩计算总分,然后按上述规则排序,最后按排名顺序输出前五名名学生的学号和总分。注意,在前 $5$ 名同学中,每个人的奖学金都不相同,因此,你必须严格按上述规则排序。例如,在某个正确答案中,如果前两行的输出数据(每行输出两个数:学号、总分) 是:

$7$ $279$
$5$ $279$

这两行数据的含义是:总分最高的两个同学的学号依次是 $7$ 号、$5$ 号。这两名同学的总分都是 $279$ (总分等于输入的语文、数学、英语三科成绩之和) ,但学号为 $7$ 的学生语文成绩更高一些。如果你的前两名的输出数据是:

$5$ $279$
$7$ $279$

则按输出错误处理,不能得分。

输入格式

共 $n+1$行。

第 $1$ 行为一个正整数$n ( \le 300)$,表示该校参加评选的学生人数。

第 $2$ 到 $n+1$ 行,每行有 $3$ 个用空格隔开的数字,每个数字都在 $0$ 到 $100$ 之间。第 $j$ 行的 $3$ 个数字依次表示学号为 $j-1$ 的学生的语文、数学、英语的成绩。每个学生的学号按照输入顺序编号为 $1\sim n$(恰好是输入数据的行号减 $1$)。

所给的数据都是正确的,不必检验。

//感谢 黄小U饮品 修正输入格式

输出格式

共 $5$ 行,每行是两个用空格隔开的正整数,依次表示前 $5$ 名学生的学号和总分。

样例 #1

样例输入 #1

6
90 67 80
87 66 91
78 89 91
88 99 77
67 89 64
78 89 98

样例输出 #1

6 265
4 264
3 258
2 244
1 237

样例 #2

样例输入 #2

8
80 89 89
88 98 78
90 67 80
87 66 91
78 89 91
88 99 77
67 89 64
78 89 98

样例输出 #2

8 265
2 264
6 264
1 258
5 258

代码

import java.util.Arrays;
import java.util.Scanner;
/*
 * 思路:使用Comparable接口,同时实现compareTo()方法,然后改成降序排列即可,
 * 最后输出前五个。
 */
public class Main{
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        Cj[] cjs = new Cj[n];
        for(int i = 0;i<cjs.length;i++)
        {
            // 读取数据
            cjs[i] = new Cj(in.nextInt(),in.nextInt(),in.nextInt(),i+1);
        }
        Arrays.sort(cjs);                   // 自带快速排序
        for(int i = 0;i<5;i++)              // 输出前五个即可
        {
            System.out.println(cjs[i]);
        }
    }
}
// 记得实现Comparable接口,同时在<>中写上实现Comparable接口的类名
class Cj implements Comparable<Cj>{
    int no;                 // 因为最后需要输出学号,所以自然要搞个no变量
    int y;                  // 语文成绩
    int s;                  // 数学成绩
    int e;                  // 英语成绩
    int z;                  // 总分成绩

    public Cj() {

    }
    public Cj(int y,int s,int e,int no) {
        this.y = y;
        this.s = s;
        this.e = e;
        z = y+s+e;
        this.no = no;
    }

    // 以下的方法都是基于Arrays.sort()后,输出的是前面的数据写出的方法
    public int compareTo(Cj x) {
        if(this.z == x.z)
        {
            if(this.y == x.y)
            {
                return this.no - x.no;  // 如果想要小的在前,this.变量-引用.变量
            }
            return x.y - this.y;        // 如果想要大的在前,引用.变量-this.变量
        }
        return x.z - this.z;            // 如果想要大的在前,引用.变量-this.变量
    }
    
    // 输出时我重写了toString()方法,所以在Main中是直接输出对象自动调取
    // 该对象的toString()方法。
    public String toString() {
        return no+" "+z;
    }

}

题后总结

一、由此我们可以得出,如果想要排序一个数组,Arrays.sort()函数只能解决基本数据类型的数组,如果想要排序一个引用类型的数组,则需要实现Comparable接口,(别忘了接口后还需<实现接口的类名>)同时重写compareTo()方法。
二、关于compareTo()方法的重写, 
如果想要让大的在数组前面,引用.变量-this.变量
如果想要让小的再数组前面,this.变量-引用.变量

标签:练习赛,2022,int,样例,Scanner,SQNU,str,public,charAt
From: https://www.cnblogs.com/Abyssun/p/16940154.html

相关文章

  • 2022 FIFA 世界杯 首发阵容组件库 All In One
    2022FIFA世界杯首发阵容组件库AllInOnehttps://live.douyin.com/fifaworldcup/7079013128293482526突尼斯vs法国https://codepen.io/xgqfrms/pen/ZERMxZE......
  • NOIP2022T1题解
    [NOIP2022]种花(民间数据)题目描述小C决定在他的花园里种出\(\texttt{CCF}\)字样的图案,因此他想知道\(\textttC\)和\(\textttF\)两个字母各自有多少种种花的方......
  • 2022.11.30杂记
    1、ROS与Ubuntu的版本匹配: 2、“nospaceleftondevice”(磁盘空间不足)问题解决:https://blog.csdn.net/youmatterhsp/article/details/803825523、磁盘扩展后ubuntu......
  • MySQL常用函数-24课-2022-11-30
    --====================常用函数==============================--数学运算SELECTABS(-80)--绝对值SELECTCEILING(9.4)--向上取整SELECTFLOOR(9.4)--向下......
  • 2022 ICPC 西安
    https://codeforces.com/gym/104077C.CloneRanran签到题#include<iostream>#include<cstdio>#include<cstring>#include<cmath>#include<algorithm>usingnames......
  • DQL-分页和排序-2022-11-30
    分页和排序--排序升序ASC 降序DESC --语法ORDERBY   SELECTs.`studentno`,studentname,`subjectno`,`studentresult`FROMstudentASsLEFTJOINresult......
  • 中睿天下入选2022Venture50风云榜300强
    近日,投资界2022Venture50初评榜单发布,初评选历经半年时间,特邀超百位投资人从多个资本维度进行评选,中睿天下在3000余家企业甄选中脱颖而出,进入2022Venture50风云榜300强,同时......
  • 2022最新iOS最新打包发布流程
     关于如何发布iOS应用到AppStroe,苹果开发者中心已经给出了很详细的说明。和普通的iOS应用一样,使用ReactNative开发的iOS应用也需要使用普通的iOS应用的发布流程,总的来......
  • 2022最新iOS证书(.p12)、描述文件(.mobileprovision)申请和HBuider打包及注意注意事项
     制作p12证书1、在钥匙串界面中,选中安装好的开发者证书,【右键】选择导出在弹出的界面中3、在接下来的弹窗中填写p12文件的安装密码(后面他人安装该p12文......
  • DQL-20课 自连接笔记及查询练习-2022-11-30
    自连接自己的表和自己连接一张表拆成两张一样的表查询父子信息 (了解即可)--学号、姓名、年级名字SELECT`studentno`,`studentname`,`gradename`FROMstudentsINNER......