Transmission Door
C: Given an arrangement of N of N, each operation can place a number in the first or last of the sequence, and ask to turn the sequence into such an arrangement of 1 2 3....n.
Idea: We must first see a fact, that is, each time we choose some not in the corresponding position of these numbers in order to put in front or put behind so that the final sequence is we want this sequence, then at least, we will find a longest rise plus a sub-sequence, then we want these not moving, All that is left in order can be obtained, and this is the least of the steps.
"Brain hole good problem"
AC Code
const int MAXN = 1e5+5;
int A[MAXN], DP[MAXN];
void Solve ()
{
int n;
while (CIN >> N) {
Fill (DP, 0);
for (int i = 1; I <= n; i + +) {
cin >> a[i];
Dp[a[i]] = dp[a[i]-1] + 1;
}
int mx = 0;
for (int i = 1; I <= n; i + +)
mx = max (mx, dp[i]);
cout << n-mx << endl;
}
}
D: "Construct a good question!"
Test instructions: Given some edges and flags whether these edges are in the smallest spanning tree of the graph, ask if you can construct a picture that satisfies the edge of the topic, and give these edges according to the input order of the edges.
Idea: The first obvious idea is that we want this n-1 to be constructed into a chain tree, the rest of the add up, so we first in accordance with the weight of the size of a sequence, and then the first 1 of the edge of processing, and then go to the edge of 0, then when we meet the weight of this edge than the corresponding in the chain tree above the Benquan is smaller, Then it is impossible, this time the key point of judgment, that is the most difficult to write the place, the specific implementation please look at the code .....
AC Code
const int MAXN = 1E5+5; struct node {int u, V, W, id, F;}
E[MAXN];
BOOL Cmp1 (node x, node Y) {if (x.f = = Y.F) return X.W < Y.W;
return X.F > Y.f;
} bool Cmp2 (node x, node Y) {return x.id < y.id;} void Solve () {int n, m;
while (CIN >> n >> m) {int cnt = 0;
for (int i = 1; I <= m; i + +) {cin >> e[i].w >> e[i].f; E[i].id = i;
CNT + = E[I].F;
} if (cnt! = n-1) {printf (" -1\n");
Continue
} sort (e+1, e+1+m, CMP1);
for (int i = 1; I <= n-1; i + +) {e[i].u = i; e[i].v = i+1;
} int flag = 1;
int id1 = 0, id2 = 2;
for (int i = n; i <=m; i + +) {if (id1 + 2 = = Id2) id2++, id1 = 1;
else id1++;
if (E[I].W < E[ID2-1].W) {//This is the most critical place.
Flag = 0;
Break } e[i].u = id1, e[i].v = Id2;
} if (!flag) {printf (" -1\n");
Continue
} sort (e+1, e+1+m, CMP2);
for (int i = 1; I <= m; i + +) {printf ("%d%d\n", e[i].u, E[I].V); }
}
}