根据以下要求写一段c语言代码【问题描述】在SAU-ACM中,tls的女装无疑是最吸引人的,但是tls不想让大家轻易地看到他的女装。tls准备了一个1到N的重排列,并将它们按顺序分给许多ACM队的队员,这意味着每个队员会得到一个或多个数字。现在,队员们需要做一个配合,那就是从N数到1,每个人只能喊出自己拥有的数字,并且只能按照得到数字的顺序喊出。比如,一名队员依次得到数字3,2,4,他就不能在喊出2之前喊出4。那么问题来了,至少需要多少名队员才能完成这个配合呢?让我们一起为tls的女装倒计时吧! 【输入形式】 多组输入。 输入第一行给出一个整数N (0 <= N <=50000),下一行给出从1到N的整数序号的一个重排列,代表tls手中数字的顺序。数字间以空格分隔。 【输出形式】 在一行中输出完成这个倒计时至少需要的队员数。 【样例输入】 9 8 4 2 5 3 9 1 6 7 【样例输出】 4
时间: 2024-03-17 22:43:06 浏览: 74
开发辅助工具_C语言_
以下是参考代码:
```c
#include <stdio.h>
#define MAX_N 50005
int a[MAX_N]; // 存储输入的数字序列
int max(int x, int y) {
return x > y ? x : y;
}
int binary_search(int l, int r, int target) {
// 在 a[l...r] 中二分查找第一个大于等于 target 的数
while (l < r) {
int mid = (l + r) / 2;
if (a[mid] < target) {
l = mid + 1;
} else {
r = mid;
}
}
return l;
}
int main() {
int n;
while (scanf("%d", &n) == 1) {
// 输入数字序列
for (int i = 0; i < n; i++) {
scanf("%d", &a[i]);
}
int len = 0; // 当前数字序列的长度
for (int i = 0; i < n; i++) {
if (len == 0 || a[i] > a[len - 1]) {
// 如果当前数字比序列中最大的数字还要大,就直接加到序列末尾
a[len++] = a[i];
} else {
// 否则在数字序列中找到第一个比它大的数
int pos = binary_search(0, len - 1, a[i]);
// 用它来替换当前数字
a[pos] = a[i];
}
}
printf("%d\n", len);
}
return 0;
}
```
代码思路和之前的解题思路一致,使用了一个数组 `a` 来存储输入的数字序列,使用 `len` 来表示当前数字序列的长度。在扫描输入的数字序列时,如果当前数字比序列中最大的数字还要大,就直接加到序列末尾;否则在数字序列中找到第一个比它大的数,用它来替换当前数字。最后输出数字序列的长度即可。
阅读全文