输入格式: 输入首先给出两个正整数N(≤105)和K(≤500)。其中K是最低里程,即为照顾乘坐短程航班的会员,航空公司还会将航程低于K公里的航班也按K公里累积。随后N行,每行给出一条飞行记录。飞行记录的输入格式为:18位身份证号码(空格)飞行里程。其中身份证号码由17位数字加最后一位校验码组成,校验码的取值范围为0~9和x共11个符号;飞行里程单位为公里,是(0, 15 000]区间内的整数。然后给出一个正整数M(≤105),随后给出M行查询人的身份证号码。 输出格式: 对每个查询人,给出其当前的里程累积值。如果该人不是会员,则输出No Info。每个查询结果占一行。请用严格的c语言实现要求
时间: 2023-12-06 17:42:22 浏览: 27
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXN 100005
#define MAXM 11
typedef struct {
char id[MAXM];
int mile;
} Record;
Record records[MAXN];
int cmp(const void *a, const void *b) {
return strcmp(((Record *)a)->id, ((Record *)b)->id);
}
int binary_search(char *id, int n) {
int l = 0, r = n - 1;
while (l <= r) {
int mid = (l + r) / 2;
int cmp_res = strcmp(id, records[mid].id);
if (cmp_res == 0) {
return mid;
} else if (cmp_res < 0) {
r = mid - 1;
} else {
l = mid + 1;
}
}
return -1;
}
int main() {
int n, k;
scanf("%d%d", &n, &k);
for (int i = 0; i < n; ++i) {
scanf("%s%d", records[i].id, &records[i].mile);
}
qsort(records, n, sizeof(Record), cmp);
int m;
scanf("%d", &m);
while (m--) {
char id[MAXM];
scanf("%s", id);
int idx = binary_search(id, n);
if (idx == -1) {
printf("No Info\n");
} else {
int ans = 0;
while (idx < n && strcmp(id, records[idx].id) == 0) {
ans += records[idx].mile >= k ? records[idx].mile : k;
++idx;
}
printf("%d\n", ans);
}
}
return 0;
}
```
解析:题目要求统计每个人的里程累积值,可以考虑按照身份证号码将记录排序,然后对于每个查询的身份证号码,可以使用二分查找找到对应的记录,然后遍历该身份证号码的所有记录,统计里程累积值即可。需要注意的是,照顾短程航班的会员,需要将里程低于K公里的航班也按K公里累积,因此在统计里程累积值时需要进行判断。