AtCoder ABC 127 A&B&C&D AtCoder - 127
Je serai de retour pour résoudre E & F dans un proche avenir.
2019/05/27 Correction du code B
A - Ferris Wheel
private void solveA() {
int a = nextInt();
int b = nextInt();
if (a <= 5) {
out.println(0);
} else if (a <= 12) {
out.println(b / 2);
} else {
out.println(b);
}
}
B - Algae
private void solveB() {
int r = nextInt();
int d = nextInt();
int x2000 = nextInt();
int pre = x2000;
for (int i = 1; i <= 10; i++) {
pre = r * pre - d;
out.println(pre);
}
}
C - Prison
4 2 1 3 2 4
--La première porte s'ouvre avec les touches 1,2,3 --La deuxième porte s'ouvre avec les clés 2, 3 et 4
Key:1 | Key:2 | Key:3 | Key:4 | |
---|---|---|---|---|
Gate:1 | O | O | O | |
Gate:2 | O | O | O | |
La clé pour tout ouvrir | ↑ | ↑ |
Je l'ai remplacé par un numéro.
Key:1 | Key:2 | Key:3 | Key:4 | |
---|---|---|---|---|
Gate:1 | 1 | 1 | 1 | |
Gate:2 | 1 | 1 | 1 | |
total | 1 | 2 | 2 | 1 |
Une clé avec total = nombre de portes peut ouvrir toutes les portes. Pour le traitement tel que l'ajout d'une certaine plage à une certaine plage, la méthode Imos est plus rapide.
Je publierai donc la liste habituelle des sites de référence
--Site de référence (méthode Imos et somme cumulée)
int n = nextInt();
int m = nextInt();
//Pour mémo quelle touche numérique est requise à chaque porte
int[] wk = new int[n];
for (int i = 0; i < m; i++) {
int l = nextInt() - 1;
int r = nextInt() - 1;
wk[l] += 1;
if (r + 1 < n) {
wk[r + 1] -= 1;
}
}
//
for (int i = 1; i < n; i++) {
wk[i] += wk[i - 1];
}
int cnt = 0;
for (int i = 0; i < n; i++) {
if (wk[i] == m) {
cnt++;
}
}
out.println(cnt);
D - Integer Cards
--Pour la 3ème partie, le traitement suivant est effectué dans le code, mais c'est parce que "B et C sont disposés dans l'ordre décroissant, donc la partie une fois réécrite avec C ne sera pas réécrite après cela (une fois réécrite C plus grand que C n'apparaît pas) " ――Si vous ne le faites pas, vous manquerez de temps en raison d'un traitement supplémentaire.
//Il ne sert à rien de réécrire (comparer) au même endroit, alors décalez le début
int start = 0;
--Code complet
private void solveD() {
int n = nextInt();
int m = nextInt();
long[] a = LongStream.range(0, n).map(i -> nextLong()).toArray();
//Trier par ordre croissant
Arrays.sort(a);
int[][] bc = IntStream.range(0, m).collect(() -> new int[m][2],
(t, i) -> {
t[i][0] = nextInt();
t[i][1] = nextInt();
},
(t, u) -> {
Stream.concat(Arrays.stream(t), Arrays.stream(u));
});
//Trier par ordre décroissant de C
Arrays.sort(bc, (x, y) -> -Integer.compare(x[1], y[1]));
//Il ne sert à rien de réécrire (comparer) au même endroit, alors décalez le début
int start = 0;
for (int j = 0; j < m; j++) {
int max = Integer.min((start + bc[j][0]), n);
for (int k = start; k < max; k++) {
if (bc[j][1] > a[k]) {
//a[i]Est plus petit est réécrit
a[k] = bc[j][1];
//Se préparer à décaler le prochain départ
start = k + 1;
} else {
//Déjà trié, donc un[i]Plus besoin de comparer si c'est plus gros
break;
}
}
}
//total
long res = Arrays.stream(a).sum();
out.println(res);
}
Recommended Posts