打印 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