記事ディレクトリ
トピック1
トピックの説明
年齢の一致
この質問は空欄を埋める質問です。結果を計算した後、コードのoutputステートメントを使用して、埋められた結果を出力します。
シャオミンはいとこと一緒に映画を見に行き、誰かが彼らの年齢を尋ねました。XiaoMing氏は次のように述べています。今年は私たちの幸運な年です。私の誕生年の4桁は、正確に私の年齢になります。いとこもそうです。今年は2014年であることが知られており、シャオミンが言及した年齢は1歳です。
シャオミンの誕生年を推測して記入してください。
運用上の制限
- 最大実行時間:1秒
- 最大実行メモリ:128M
答え
public class Main {
public static void main(String[] args) {
for (int i = 2014; i > 1950; i--) {
if ((2014 - i) == (i % 10 + (i / 10) % 10 + (i / 100) % 10 + (i / 1000) % 10))
System.out.println(i);
}
}
}
注:間隔(1950、2014)を決定します。結果は2006、1988です。彼は私のいとこなので、2006年に生まれました。
回答:私:1988年彼:2006年
トピック2
トピックの説明
トランプの三角形
この質問は空欄を埋める質問です。結果を計算した後、コードのoutputステートメントを使用して、埋められた結果を出力します。
A、2、3、4、5、6、7、8、9、合計9枚のカードが正三角形に配置されています(Aは1として数えられます)。各辺の合計は等しくなければなりません。下の図は配置です。
そのような取り決めはたくさんあるかもしれません。
回転と鏡像(対称性)を考えると、同じものは同じですが、配置はいくつありますか?
この数を計算して送信してください。
運用上の制限
- 最大実行時間:1秒
- 最大実行メモリ:256M
答え
public class Main {
static int ans = 0;
static int[] A = new int[9];// 用来存数据
static int[] B = new int[9];// 用来表示该数组的位置是否有被遍历过
public static void main(String[] args) {
dfs(0);
// 因为旋转和镜像代表的是同一种,但是它们各重复三次,即重复六次,所以最后要除以六
System.out.println(ans / 6);
}
public static void dfs(int num) {
if (num == 9 && ((A[0] + A[1] + A[2] + A[3]) == (A[3] + A[4] + A[5] + A[6]))
&& ((A[3] + A[4] + A[5] + A[6]) == (A[6] + A[7] + A[8] + A[0]))) {
ans++;
return;
}
for (int i = 0; i < 9; i++) {
if (B[i] == 0) {
A[num] = i + 1;// 对数组进行赋值
B[i] = 1;// 表示该位置已经赋值
dfs(num + 1);
B[i] = 0;// 回溯
}
}
}
}
注:dfs検索、完全な配置、および3つの要素の把握が最も重要です
- エントリパラメータ設定
- dfsのエクスポート設定
- バックトラックが必要かどうか
回答:144
トピック3
トピックの説明
ボールゲーム
箱の中にはn個のボールがあります。AとBが交代で箱からボールを取り出します。誰もが相手が取ったボールの数と箱に残っているボールの数を確認できます。これらはすべて賢く、間違いはありません。判断。
私達は同意します:
各人が箱から取るボールの数は、1、3、7、または8でなければなりません。あなたがボールを取る番になると、あなたは棄権することはできません!Aは最初にボールを取り、次にボールが終わるまで交互に取ります。最後のボールを奪われる側が敗者(負け側)
どちらの側も間違っていなくても、Aが特定の初期ボール数で勝つことができるかどうかを判断するようにプログラムしてください。
説明を入力してください
最初は整数n(n <100)です。これは、次にn個の整数があることを意味します。
次に、n個の整数があり、それぞれが1行にあり(整数<10 ^ 4)、ボールの初期数を表します。
出力の説明
次に、プログラムはn行を出力し、Aが勝つか負けるかを示します(0は負け、1は勝ち)。
入力サンプル
4 1 2 10 18
サンプル出力
0 1 1 0
運用上の制限
- 最大実行時間:1秒
- 最大実行メモリ:256M
答え
(暴力的な解決策)
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
//类似于爬楼梯的递归模式
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
List<Integer> l = new ArrayList<>();
for (int i = 0; i < n; i++) {
l.add(scanner.nextInt());
}
for (int j = 0; j < n; j++) {
if (A(l.get(j))) {
System.out.println(1);
} else {
System.out.println(0);
}
}
}
public static boolean A(int m) {
if (m >= 1) {
switch (m) {
case 1:
return false;// 当你要去拿球时,并且最后只剩下1个球时,输
case 3:
return false;// 当你要去拿球时,并且最后只剩下3个球时,输
case 7:
return false;// 输
case 8:
return true;// 赢
default:
return (!A(m - 1) || !A(m - 3) || !A(m - 7) || !A(m - 8));// 这个时候表示自己拿1或3或7或8个球,然后这时对象变成了对面的一个人,所以要加!
}
}
return false;
}
}
(dpソルブ)
import java.util.Scanner;
//dp解法
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
boolean[] A = new boolean[10009];// 因为n<10^4
A[0] = true;
for (int i = 1; i < 10009; i++) {
A[i] = (!(A[i - 1]) || (i >= 3 && !A[i - 3]) || (i >= 7 && !A[i - 7]) || (i >= 8 && !A[i - 8]));// 这个时候表示自己拿1或3或7或8个球,然后这时对象变成了对面的一个人,所以要加!
}
// 为了方便输出
int[] B = new int[n + 1];
for (int i = 1; i <= n; i++) {
int j = scanner.nextInt();
if (!A[j]) {
B[i] = 0;
} else {
B[i] = 1;
}
}
for (int k = 1; k <= n; k++) {
System.out.println(B[k]);
}
}
}
暴力的な解決策:冗長なコード、高い繰り返し率、面倒で面倒
dpソリューション:結果は2つだけです。彼が勝つか、私が勝つか、正しいか間違っているかの関係です。「||」を使用して4つの方法を選択します。つまり、勝つ方法が1つある限り、私は勝ちます。最後に、メソッドが最適値です。
例:4ボール
1、1、1、1(負けました)
3、1(勝った)
計算結果をトラバースして蓄積します