一、Problem
輸入
第一行輸入一個整數N,表示鴿子的數量
第二行輸入 N 個字符,表示每一隻鴿子的朝向。L 表示超向左邊,R 表示朝向右邊。
輸出
輸出一個數字表示答案
8
RLLRRRLL
4
樣例1解釋
將編號爲 1,4,7,8 的鴿子調整轉向
數據規模
, 且 N 爲偶數,
二、Solution
至少要用 算法才能 A 掉…
嘗試一:計數
- 我的第一想法是統計區間 裏面的 L 和 R 的數量記錄到 L1 和 R1 中,以及 中的 L 和 R 的數量到 L2 和 R2 中。
- 然後計算出兩邊的需要調整的數目,取最少。
很不幸,這是片面的 7/15:
import java.util.*;
import java.math.*;
import java.io.*;
public class Main{
static class Solution {
void init() {
Scanner sc = new Scanner(new BufferedInputStream(System.in));
int n = sc.nextInt();
char[] s = sc.next().toCharArray();
int L1 = 0, R1 = 0, L2 = 0, R2 = 0;
for (int i = 0; i < n/2; i++) {
if (s[i] == 'L') L1++;
else R1++;
}
for (int i = n/2; i < n; i++) {
if (s[i] == 'L') L2++;
else R2++;
}
System.out.println(Math.min(L1+R2, L2+R1));
}
}
public static void main(String[] args) throws IOException {
Solution s = new Solution();
s.init();
}
}
複雜度分析
- 時間複雜度:,
- 空間複雜度:,
方法二:
方法一 WA 的原因可能是我鑽了空子,沒用把題目的條件都用上,比如偶數編號的鴿子一個方向,奇數方向的鴿子一個方向。
也就是說:兩個條件滿足其一即可…
import java.util.*;
import java.math.*;
import java.io.*;
public class Main{
static class Solution {
int n;
char[] s;
int LR(){
int ll = 0, lr = 0, rl = 0, rr = 0;
for (int i = 0; i < n/2; i++) {
if (s[i] == 'L') ll++;
else lr++;
}
for (int i = n/2; i < n; i++) {
if (s[i] == 'L') rl++;
else rr++;
}
return Math.min(ll+rr, lr+rl);
}
int evenOdd() {
int oddL = 0, oddR = 0;
for (int i = 0; i < n; i+=2) {
if (s[i] == 'L') oddL++;
if (s[i] == 'R') oddR++;
}
int evenL = 0, evenR = 0;
for (int i = 1; i < n; i+=2) {
if (s[i] == 'L') evenL++;
if (s[i] == 'R') evenR++;
}
return Math.min(oddL+evenR, evenL+oddR);
}
void init() {
Scanner sc = new Scanner(new BufferedInputStream(System.in));
n = sc.nextInt();
s = sc.next().toCharArray();
int res = Math.min(LR(), evenOdd());
System.out.println(res);
}
}
public static void main(String[] args) throws IOException {
Solution s = new Solution();
s.init();
}
}
複雜度分析
- 時間複雜度:,
- 空間複雜度:,