一緒に書く習慣をつけましょう!「ナゲッツデイリーニュープラン・4月アップデートチャレンジ」に参加して10日目です。クリックしてイベントの詳細をご覧ください。
序文
一般的に、ブルーブリッジカップは小さな打撃ではないので、今回は毎日チェックインを続け、毎日6問以上、PTAから順番に基礎トレーニングを開始します。初日にチェックイン
死ぬまでブラシ死ぬまでブラシ。ここでは、質問の難易度に応じて簡単な注文をします。
L1-001 Hello World(5分)
フォーマットに慣れる
import java.util.Scanner;
public class Main{
public static void main(String[] args){
Scanner Scanner = new Scanner(System.in);
System.out.println("Hello World!");
}
}
复制代码
L1-004摂氏温度を計算する(5ポイント)
import java.util.Scanner;
public class Main{
public static void main(String[] args){
Scanner scanner = new Scanner(System.in);
int c = scanner.nextInt();
c = 5*(c-32)/9;
System.out.println("Celsius = "+c);
}
}
复制代码
L1-003 1桁の統計(15ポイント)
import java.util.Scanner;
public class Main {
static int[] count;
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String InputString = scanner.next();
count = new int[10];
scanner.close();
for (char c : InputString.toCharArray()) {
count[c-'0']++;
}
for (int i = 0; i < count.length; i++) {
if(count[i]!=0){
System.out.println(i+":"+count[i]);
}
}
}
}
复制代码
L1-005試験席番号(15点)
注意点
このトピックは実際には非常に単純です。これは主に入力の最適化の問題です。スキャナーが機能しません。私にはそれを知る能力がありません。
import java.io.*;
import java.util.Scanner;
import java.util.StringTokenizer;
/** Class for buffered reading int and double values */
class Reader {
static BufferedReader reader;
static StringTokenizer tokenizer;
/**
* call this method to initialize reader for InputStream
*/
static void init(InputStream input) {
reader = new BufferedReader(
new InputStreamReader(input));
tokenizer = new StringTokenizer("");
}
/**
* get next word
*/
static String next() throws IOException {
while (!tokenizer.hasMoreTokens()) {
//TODO add check for eof if necessary
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());
}
}
public class Main {
static Student[] Students;
public static void main(String[] args) throws IOException {
Reader.init(System.in);
int N = Reader.nextInt();
Students = new Student[N+1];
for (int i = 0; i < N; i++) {
Student student = new Student(Reader.next(),Reader.nextInt(),Reader.nextInt());
Students[student.id_temp] = student;
}
int M = Reader.nextInt();
for (int i = 0; i < M; i++) {
find();
}
}
public static void find() throws IOException {
int id_temp = Reader.nextInt();
Student student = Students[id_temp];
System.out.println(student.id_stu+" "+student.id_set);
}
static class Student{
String id_stu;
int id_temp;
int id_set;
public Student(){}
public Student(String id_stu, int id_temp, int id_set) {
this.id_stu = id_stu;
this.id_temp = id_temp;
this.id_set = id_set;
}
@Override
public String toString() {
return "Student{" +
"id_stu='" + id_stu + '\'' +
", id_temp=" + id_temp +
", id_set=" + id_set +
'}';
}
}
}
复制代码
L1-002印刷砂時計(20点)
アイデア
実際、言うのも簡単です。主に、メインレイヤーには複数のレイヤーがあり、各レイヤーは規則的であることを知っておく必要があります。
この砂時計は等差数列であるため、d = 2であり、合計n(1+(n-1)* d +1)/ 2 = n^2/2となります。ただし、ここで入力するNは、2つの合計、つまり2つの同一のシーケンス-1の合計であることに注意してください。これは、最初のシーケンスが重複しているためです。
(多すぎても自動的に切り捨てられても構いません)
次に、各レイヤーにいくつかの要素があります。これも単純な等差数列です。
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
String ch = sc.next();
int h = (int) Math.sqrt((n+1)/2);// 计算高度
for (int i = 0; i < h; i++) //打印上半层沙漏
{
for (int j = 0; j < i; j++)
System.out.print(" ");
for (int j = 0; j < 2 * (h - i) - 1; j++)
System.out.printf("%c", ch.toCharArray()[0]);
System.out.println();
}
for (int i = 2; i <= h; i++) //打印下半层沙漏
{
for (int j = 0; j < h - i; j++)
System.out.print(" ");
for (int j = 0; j < 2 * i - 1; j++)
System.out.printf("%c", ch.toCharArray()[0]);
System.out.print("\n");
}
System.out.printf("%d", n - 2 * h * h + 1);
}
}
复制代码
L1-006連続係数(20ポイント)
このトピックは非常に良いですが、私は力ずくの解決策しか知りません
アイデア
または、暴力のアイデア、最初は除数を分解することです、ここでは2から始めます。次に、インクリメントしたいので、2が最初の除数なので、2、2、3、4、5、6の合計から合計= 1を推測して、これらの数値を乗算し始めました。sum <= nの場合にのみ、これらの要素の長さと最初の添え字を記録します。たとえば、上記のレコードは2から6です。小さいものから大きいものまで探しているので、最初に見つかった最小の長さではありません。ですから、楽しみにして次の3から始めなければなりません。
現時点では、除数を探しているので、最初にMath.sqrt(N)を使用して複雑さを軽減できます。
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
long i = 0, j = 0;
long len = 0, start = 0, sum = 0;
long n;
Scanner sc = new Scanner(System.in);
n = sc.nextInt();
for (i = 2; i < Math.sqrt(n); i++) {
sum = 1;
for (j = i; sum <= n; j++) {
// j表示当前因子,i表示首因子,sum表示目前乘积,开始暴力枚举
sum = sum * j;
if (n % sum == 0 && j - i + 1 > len) {
start = i;
len = j - i + 1;
}
}
}
if (start == 0) {
start = n;
len = 1;
}
System.out.println(len);
for (int k = 0; k < len - 1; k++) {
System.out.print(start + k + "*");
}
System.out.println(start + len - 1);
}
}
复制代码
最適化に関しては、3から列挙し続けることはできないため、KMPのアイデアで最適化できるはずだと思います。たとえば、630、最小値は4 5 6 7、連続値は5 6 7、つまり、最初は2 4 5 67で、2回目は2から6を記録します。34 567は5から6を記録します。 7で、3回目は4から始まります。だからこれについて考えてください。