Java Blue Bridge Cupのビデオでコードを説明しています。
1.飛行時間
[問題の背景]
シャオHは、ブルーブリッジカップインターナショナルコンテストに参加するために米国に行きました。Xiao Hのガールフレンドは、Xiao Hが午前10時に出発し、午前12時にアメリカに到着したことを発見したので、「飛行機は今とても速く飛んでおり、2時間でアメリカに到着することができます。
Xiao hは超音速飛行を恐れていました。注意深く観察した結果、航空機の離着陸時刻はすべて現地時間であることがわかりました。北京と米国東部の間には12時間の時差があるため、航空機は合計14時間の飛行時間を必要とします。
その後まもなく、Hのガールフレンドは中東で交換に行きました。Xiao Hは中東と北京の時差を知りませんでした。しかし、シャオHは彼のガールフレンドの往復飛行の離着陸時間を得ました。Xiao Hはガールフレンドの飛行時間を知りたいと思っています。
【不具合の内容】
タイムゾーンをまたぐ可能性のあるフライトの場合、所定の往復時間が表示されます。飛行機の往復飛行時間が同じであると仮定して、飛行機の飛行時間を求めます。
[入力形式]
標準入力からデータを読み込みます。
入力に複数のデータセットが含まれています。
最初の行を正の整数Tとして入力し、入力データグループの数を示します。
各データセットには2つの行が含まれ、最初の行は往路の離陸と着陸の時間、2番目の行は復路の離陸と着陸の時間です。
離着陸時間の形式は次のとおりです
h1:m1:s1 h2:m2:s2
または
h1:m1:s1 h3:m3:s3(+1)
または
h1:m1:s1 h4:m4:s4(+2)
は、現地時間のフライトであることを意味しますh1 m1 s1秒で離陸、
最初のフォーマットは、h2で着陸することを意味しますm2 min s2 sec
2番目の形式は、現地時間で翌日のh3:m3:s3秒に着陸することを意味します。
3番目の形式は、現地時間の3日目にh4m4m4s4秒で着陸することを意味します。
このトピックでhⓂ️sの形式で示されるすべての時間について、(0 <= h <= 23、0 <= m、s <= 59)を保証します。
【出力形式】
標準出力に出力します。
データセットごとに、時間の行hh:mm:ssが出力され、飛行時間がhh時間mm分ss秒であることを示します。
時刻が1桁の場合は、先行ゼロを埋め込む必要があることに注意してください。たとえば、3時間、4分、5秒は03:04:05のように記述します。
[入力例]
3
17:48:19
21:57:24 11:05:18
15:14:23 17:21:07 00:31:46(+1)
23:02:41 16:13:20 (+1)
10:19:19 20:41:24 22:19:04 16:41:09
(+1)
[出力例]
04:09:05
12:10:39
14:22:05
public class HangBan {
static Scanner sc=new Scanner(System.in);
public static void main(String[] args) throws Exception {
int T=sc.nextInt();
sc.nextLine();
for(int i=0;i<T;i++) {
long time1=getTime();
long time2=getTime();
long t=(time1+time2)/2;
System.out.printf("%02d:%02d:%02d\n",t/3600,t/60%60,t%60);
}
}
private static long getTime() throws Exception {
String line=sc.nextLine();
String[] split=line.split(" ");
SimpleDateFormat format=new SimpleDateFormat("HH:mm:ss");
Date t1=format.parse(split[0]);
Date t2=format.parse(split[1]);
int d=0;
if(split.length==3) {
d=Integer.parseInt(split[2].substring(2,3));
}
return d*24*3600+t2.getTime()/1000-t1.getTime()/1000;
}
}
2.三体攻撃
【解説】
三体男が地球を襲う。攻撃に抵抗するために、地球人はA×B×Cの軍艦を送り、A列、B列、C列に立方体を形成しました。このうち、行i、行j、列k(戦艦(i、j、k)と表記)の戦艦のライフバリューはd(i、j、k)です。
三体の男は地球上でmラウンドの「キューブ攻撃」を開始します。各攻撃は小さなキューブ内のすべての戦艦に同じダメージを与えます。具体的には、t番目の攻撃は、lat、rat、lbt、rbt、lct、rct、htの7つのパラメーターで記述され、すべてがi∈
[lat、rat]、j∈[lbt、rbt]、k∈[lct、rctを満たします。] '戦艦(i、j、k)はhtでダメージを受けます。軍艦が受けたダメージの合計が防御力を超えると、軍艦は爆発します。
地球司令官は、攻撃の最初の爆弾船が爆発した後、あなたに彼に知らせることができることを望みます。
[入力形式]
標準入力からデータを読み込みます。
最初の行には4つの正の整数A、B、C、m
が含まれ、2番目の行にはA×B×Cの整数が含まれます。ここで、((i − 1)×B +(j − 1))×C +(k − 1)+1の数値はd(i、j、k)で、
3行目からm + 2行目と(t − 2)行目には、7つの正の整数lat、rat、lbt、rbt、lct、rctが含まれています、ht。
【出力形式】
標準出力に出力します。
最初の軍艦が爆発した後の攻撃ラウンドで出力されます。そのような戦艦が存在しなければならないことを確認してください。
【入力例】
2 2 2 3
1 1 1 1 1 1 1 1 1
1 2 1 2 1 1 1
1 1 1 2 1 2 1
1 1 1 1 1 1 2
【出力例】
2
【サンプル説明】
攻撃2回目以降、戦艦(1,1,1)は合計2ダメージを受け、防御力を超えて爆発した。
[データ規約]データの
10%の場合、B = C = 1、
データの20%の場合、C = 1、
データの40%の場合、A×B×C、m≤10,000
、データの70%の場合、 A、B、C≤200
、すべてのデータについて、A×B×C≤10 ^ 6、m≤10 ^ 6、0≤d(i、j、k)、ht≤10 ^ 9。
リソース規約:
ピークメモリ消費(仮想マシンを含む)<256M
CPU消費<3000ms
この質問はとても難しいと思います、それは私の脳が理解できるものではありません。
最初に、3層のforループが壊れてブルートフォースがクラックされますが、データの40%しか渡せません
搜到的暴力破解法
public class Santi {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int a, b, c, m;
a = input.nextInt();
b = input.nextInt();
c = input.nextInt();
m = input.nextInt();
int[][][] martix = new int[a + 1][b + 1][c + 1];
for (int i = 1; i <= a; ++i)
for (int j = 1; j <= b; ++j)
for (int k = 1; k <= c; ++k)
martix[i][j][k] = input.nextInt();
int lat, rat, lbt, rbt, lct, rct, ht;
int flag = 0;
for (int p = 1; p <= m; ++p) {
lat = input.nextInt();
rat = input.nextInt();
lbt = input.nextInt();
rbt = input.nextInt();
lct = input.nextInt();
rct = input.nextInt();
ht = input.nextInt();
for (int i = lat; i <= rat; ++i)
for (int j = lbt; j <= rbt; ++j)
for (int k = lct; k <= rct; ++k) {
martix[i][j][k] -= ht;
if (martix[i][j][k] < 0) {
flag = p;
break;
}
}
if (flag != 0)
break;
}
System.out.println(flag);
}
}
最適化:最初の二分法は悪い
ことを追跡することです。30分
以上2次元微分聴力を理解することは、あきらめることは困難です。