可变列二维数组【C语言】
废话不多说,直接看代码。
可能在这题上用的上:
P2058 [NOIP 2016 普及组] 海港https://www.luogu.com.cn/problem/P2058
int N;
scanf("%d", &N); //确定行数
int **a = malloc(N * sizeof(int*));
for (int i = 0; i < N; i++) {
int size;//确定该行列数
scanf("%d", &size);
int *temp = malloc((size + 1) * sizeof(int));
for (int i = 1; i <= size; i++) {
scanf("%d", &temp[i]);
}
temp[0] = size; //让首元素记录所在行列数
a[i] = temp;
}
for (int i = 0; i < N; i++) {
free(a[i]);
}
free(a);
当然,使用malloc分配内存要检验是否分配成功,为了清晰明了,便不在代码中出现了。
对海港这题的简陋解法:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main() {
int mark[100005];
memset(mark, 0, sizeof(mark));
int N, num = 0, left = 0, right = 0;
int q[100005];
long long timeSum[100005];
memset(timeSum, 0, sizeof(timeSum));
scanf("%d", &N);
int *tempdata[100005],top1=0;
int tempdatasize[100005];
memset(tempdatasize,0,sizeof(tempdatasize));
for (int z = 0; z < N; z++) {
int Time, Num;
int mark_temp[100005];
memset(mark_temp, 0, sizeof(mark_temp));
scanf("%d %d", &Time, &Num);
q[right++] = Time;
int temp1[Num+1],num_temp=0;
for (int i = 0; i < Num; i++) {
int temp;
scanf("%d", &temp);
if (mark[temp] == 0) {
num++;
mark[temp] = 1;
}
if (mark_temp[temp] == 0) {
timeSum[temp] += Time;
mark_temp[temp] = 1;
temp1[num_temp++]=temp;
}
}
int *a=(int*)malloc(num_temp*sizeof(int));
tempdatasize[top1]=num_temp;
tempdata[top1++]=a;
for(int i=0;i<num_temp;i++){
a[i]=temp1[i];
}
while (right >= left && q[right - 1] - q[left] >= 86400) {
for (int i = 0; i < tempdatasize[left]; i++) {
timeSum[tempdata[left][i]] -= q[left];
if (timeSum[tempdata[left][i]] == 0) {
num--;
mark[tempdata[left][i]] = 0;
free(tempdata[left]);
}
}
left++;
}
printf("%d\n", num);
}
return 0;
}