Initially, the cows are lined up in the order a1,a2,…,aNa1,a2,…,aN from left to right. Farmer John's goal is to line up the cows in the order b1,…,bNb1,…,bN from left to right. To accomplish this, he may perform a series of modifications to the ordering. Each modification consists of choosing a single cow and moving it some number of positions to the left.
Please count the minimum number of modifications required in order for Farmer John to line up his cows in the desired order.
The first line of input contains NN. The second line contains a1,a2,…,aNa1,a2,…,aN. The third line contains b1,b2,…,bNb1,b2,…,bN.
Print the minimum number of modifications required to produce Farmer John's desired ordering.
5 1 2 3 4 5 1 2 3 4 5
0
In this example, the cows are already in the desired order, so no modifications are required.
5 5 1 3 2 4 4 5 2 1 3
2
In this example, two modifications suffice. Here is one way Farmer John can rearrange his cows:
5 1 3 2 4 -> 4 5 1 3 2 -> 4 5 2 1 3
Problem credits: Benjamin Qi
[/hide]
(Analysis by Benjamin Qi)
Observation: Consider two cows aiai and ajaj such that aiai is to the left of ajaj in aa but to the right of ajaj in bb (for example, a3=3a3=3 and a4=2a4=2 in sample 2). Then Farmer John must choose cow ajaj at least once.
Proof: If cow aiai is to the left of cow ajaj, then any modification FJ performs that does not involve choosing cow ajaj preserves the relative order of cows aiai and ajaj. So if FJ never chooses cow ajaj then aiai will still be to the left of ajaj at the end, contradiction.
Claim: The answer is equal to the number of cows ajaj in aa such that there exists aiai such that (ai,aj)(ai,aj) satisfy the observation above. This will be proven later in the analysis.
This claim leads to a solution in O(N3)O(N3). Go through all pairs of cows (ai,aj)(ai,aj) such that i<ji<j and check if cow jj must be moved according to the observation above. Then print the total number of cows that need to be moved.
My code:
N = int(input()) A = list(map(int, input().split())) B = list(map(int, input().split())) need_to_move = [0]*N def pos_in_B(x): for i in range(N): if B[i] == x: return i for i in range(N): for j in range(i+1,N): if pos_in_B(A[i]) > pos_in_B(A[j]): need_to_move[j] = 1 print(sum(need_to_move))
One simplification we can make is by relabeling the cows so that cow bibi becomes cow ii. For example, we may rephrase the second sample case,
a = [5 1 3 2 4] -> a = [2 4 5 3 1] b = [4 5 2 1 3] -> b = [1 2 3 4 5]
Then we may rephrase the problem as sorting the cows in increasing order of label. Now we can rephrase the observation as checking for each jj, whether there exists i<ji<j such that ai>ajai>aj. Here is a solution running in O(N2)O(N2):
My code:
N = int(input()) A = list(map(int, input().split())) B = list(map(int, input().split())) pos_in_B = [0]*(N+1) for i in range(N): pos_in_B[B[i]] = i+1 A = [pos_in_B[v] for v in A] # now assume B=1...N ans = 0 for j in range(N): need_to_move_j = False for i in range(j): if A[i] > A[j]: need_to_move_j = True if need_to_move_j: ans += 1 print(ans)
We can optimize this to O(N)O(N) time by maintaining the quantity max_so_far=max(a1,a2,…,aj−1)max_so_far=max(a1,a2,…,aj−1). If max_so_far>ajmax_so_far>aj, then we should to move cow ajaj to the left while there is a cow with greater label than ajaj to the left of cow ajaj. Otherwise, cow ajaj has greater label than all cows to the left of it, and we set max_so_far=ajmax_so_far=aj. In either case, the first jj cows in aa will be in the same order as they are in bb. It follows that when j=Nj=N, a=ba=b.
My code:
N = int(input()) A = list(map(int, input().split())) B = list(map(int, input().split())) pos_in_B = [0]*(N+1) for i in range(N): pos_in_B[B[i]] = i+1 A = [pos_in_B[v] for v in A] # now assume B=1...N max_so_far = 0 ans = 0 for a in A: if a > max_so_far: max_so_far = a else: # max_so_far remains the same ans += 1 print(ans)
Danny Mittal's code:
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.StringTokenizer; public class MovingLeft { public static void main(String[] args) throws IOException { BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); int n = Integer.parseInt(in.readLine()); StringTokenizer tokenizerA = new StringTokenizer(in.readLine()); StringTokenizer tokenizerB = new StringTokenizer(in.readLine()); int[] a = new int[n]; int[] b = new int[n]; for (int j = 0; j < n; j++) { a[j] = Integer.parseInt(tokenizerA.nextToken()); b[j] = Integer.parseInt(tokenizerB.nextToken()); } int answer = 0; boolean[] moved = new boolean[n + 1]; int k = 0; for (int j = 0; j < n; j++) { while (moved[a[k]]) { k++; } if (b[j] == a[k]) { k++; } else { answer++; moved[b[j]] = true; } } System.out.println(answer); } }
[/hide]
翰林课程体验,退费流程快速投诉邮箱: yuxi@linstitute.net 沪ICP备2023009024号-1