题目
4 道算法题,得分 96 + 100 + 50(暴力) + 0
第一题
通过 96% 测试用例,考虑到了“N次骰子之前”而不是第N次,不知道被坑在哪里了?
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int len = sc.nextInt();
int count = sc.nextInt();
int[] stepArr = new int[count];
for (int i = 0; i < count; i++) {
stepArr[i] = sc.nextInt();
}
if (len == 0) {
System.out.println("paradox");
return;
}
int absLen = len;
int backStep = 0;
for (int i = 0; i < count; i++) {
if (i != count - 1 && absLen - stepArr[i] == 0) {//N次之前
System.out.println("paradox");
return;
} else if(absLen - stepArr[i] == 0){
System.out.println("0 " + backStep);
break;
}else if (absLen < stepArr[i]) {//走超了
backStep++;
absLen = stepArr[i] - absLen;
} else {
absLen -= stepArr[i];
}
}
System.out.println(absLen + " " + backStep);
}
}
第二题
暴力遍历,100% AC
import java.util.*;
class Square {
int up;
int down;
int left;
int right;
int front;
int back;
public void up2Down() {
int temp = up;
up = left;
left = down;
down = right;
right = temp;
}
public void left2Right() {
int temp = back;
back = right;
right = front;
front = left;
left = temp;
}
public void front2Back() {
int temp = up;
up = back;
back = down;
down = front;
front = temp;
}
public Square(int up, int down, int left, int right, int front, int back) {
this.up = up;
this.down = down;
this.left = left;
this.right = right;
this.front = front;
this.back = back;
}
@Override
public String toString() {
return "Square{" +
" " + up +
" " + down +
" " + left +
" " + right +
" " + front +
" " + back +
'}';
}
}
public class Main {
public static boolean isSame(Square s1, Square s2) { // 六面相同
return (s1.front == s2.front && s1.back == s2.back && s1.left == s2.left && s1.right == s2.right && s1.up == s2.up && s1.down == s2.down);
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int total = sc.nextInt();
ArrayList<Square> list = new ArrayList<>();
for (int i = 0; i < total; i++) {
int up = sc.nextInt();
int down = sc.nextInt();
int left = sc.nextInt();
int right = sc.nextInt();
int front = sc.nextInt();
int back = sc.nextInt();
list.add(new Square(up, down, left, right, front, back));
}
ArrayList<Square> squareKind = new ArrayList<>(); // 不相同的种类
ArrayList<Integer> squareCount = new ArrayList<>(); // 不相同种类对应骰子个数
for (int i = 0; i < total; i++) {
boolean SAME = false;
for (int j = 0; j < squareKind.size(); j++) {
if (SAME) break;
for (int x = 0; x < 4; x++) {
if (SAME) break;
if (isSame(squareKind.get(j), list.get(i))) {//相同
int newCnt = squareCount.get(j);
squareCount.set(j, newCnt + 1);
SAME = true;
break;
}
list.get(i).front2Back();
for (int y = 0; y < 4; y++) {
if (SAME) break;
if (isSame(squareKind.get(j), list.get(i))) {//相同
int newCnt = squareCount.get(j);
squareCount.set(j, newCnt + 1);
SAME = true;
break;
}
list.get(i).left2Right();
for (int z = 0; z < 4; z++) {
if (SAME) break;
if (isSame(squareKind.get(j), list.get(i))) {//相同
int newCnt = squareCount.get(j);
squareCount.set(j, newCnt + 1);
SAME = true;
break;
}
list.get(i).up2Down();
}
}
}
// System.out.println(SAME);
}
if (!SAME) {
squareKind.add(list.get(i));
squareCount.add(1);
}
}
// for (int i = 0; i < squareKind.size(); i++) {
// System.out.println(squareKind.get(i));
// }
Collections.sort(squareCount, Collections.reverseOrder());
System.out.println(squareCount.size());
for (int i = 0; i < squareCount.size(); i++) {
System.out.print(squareCount.get(i)+" ");
}
}
}
测试用例:
2
1 2 3 4 5 6
1 2 6 5 3 4
3
1 2 3 4 5 6
1 2 6 5 3 4
1 2 3 4 6 5
10
2 5 1 3 4 6
5 4 3 2 1 6
1 4 6 2 3 5
1 5 6 3 4 2
6 4 2 1 5 3
3 6 4 5 2 1
1 6 3 4 2 5
5 1 4 2 6 3
6 2 3 1 5 4
5 3 6 1 4 2
第三题
暴力解法肯定超时了,仅通过 50%
import java.util.*;
class Meal {
int hot;
int delicious;
public Meal(int hot, int delicious) {
this.hot = hot;
this.delicious = delicious;
}
}
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int noonCount = sc.nextInt();
int dinnerCount = sc.nextInt();
int needDelicious = sc.nextInt();
if (needDelicious == 0) {//不用吃饭
System.out.println(0);
return;
}
ArrayList<Meal> noonList = new ArrayList<>();
for (int i = 0; i < noonCount; i++) {
int hot = sc.nextInt();
int delicious = sc.nextInt();
noonList.add(new Meal(hot, delicious));
}
ArrayList<Meal> dinnerList = new ArrayList<>();
for (int i = 0; i < dinnerCount; i++) {
int hot = sc.nextInt();
int delicious = sc.nextInt();
dinnerList.add(new Meal(hot, delicious));
}
int minHot = Integer.MAX_VALUE;
for (int i = 0; i < noonCount; i++) {
if (noonList.get(i).hot > minHot) continue;//剪枝
for (int j = 0; j < dinnerCount; j++) {
if (dinnerList.get(j).hot > minHot) continue;//剪枝
int noonDeli = noonList.get(i).delicious;
int noonHot = noonList.get(i).hot;
int dinnerDeli = dinnerList.get(j).delicious;
int dinnerHot = dinnerList.get(j).hot;
if (noonDeli >= needDelicious) {//只吃午饭
minHot = noonHot < minHot ? noonHot : minHot;
} else if (dinnerDeli >= needDelicious) {//只吃晚饭
minHot = dinnerHot < minHot ? dinnerHot : minHot;
} else if (noonDeli + dinnerDeli >= needDelicious) {//都吃
minHot = noonHot + dinnerHot < minHot ? noonHot + dinnerHot : minHot;
}
}
}
if (minHot == Integer.MAX_VALUE) {
System.out.println(-1);
} else {
System.out.println(minHot);
}
}
}
// 测试用例
5 1 9
9 1
4 9
3 1
2 3
6 5
9 8
1 1 0
3 1
2 1
3 3 10
1 1
2 5
3 7
2 4
4 8
6 9
2 1 4
3 1
2 1
1 2
第四题
没时间了,没仔细读题,貌似是类似于填棋盘格子,相同元素不能相邻之类的…