-
存在两组数组,和4个数字a,b,c,d,要求做如下操作,将第一个数组第a个数到第b个数,第二个数组的第c个数到第d个数放到一个数组中,求出合并后数组的中间值,如果有两个中间值,取下标较小的那个。
-
第一行一个整数t表示有t个测试数据
第二行两个整数,表示两个数组的长度,
接下来两行表示两个数字的值,最后一行有四个整数a,b,c,d。
数组长度不会超过1000000。
-
每行一个整数,对应合并数组的下标在中间的那个值。
-
1 5 4 1 2 3 4 5 6 7 8 9 1 2 1 3
-
6
-
题目描述:
-
输入:
-
输出:
-
样例输入:
-
样例输出:
这道题在看完之后,觉得理解的很是费劲。不知道这里的中值是数值上的中间,还是位置上的中间。还有第几个数,不清楚是从数组下标0开始 还是从 1 开始。但是我还是按照正确的理解写了出来。
然后发现,C++写的严重超时,原因是cin,cout太占时间,一写出来就知道错哪里了。然后改成C语言格式,又发现数组开到100万崩掉了。很奇怪,之前C++写的程序为啥没有出现问题。后来改用new,动态生成数组空间大小。立马Accept
#include <stdio.h>
int main(){
int t;
scanf("%d",&t);
while(t--){
int len1,len2;
scanf("%d%d",&len1,&len2);
int *A = new int[len1];
int *B = new int[len2];
int *C = new int[len1+len2];
for(int i=0;i<len1;i++){
scanf("%d",&A[i]);
}
for(int i=0;i<len2;i++){
scanf("%d",&B[i]);
}
int a,b,c,d;
scanf("%d%d%d%d",&a,&b,&c,&d);
int k = 0;
for(int i=a-1;i<=b-1;i++){
C[k++] = A[i];
}
for(int i=c-1;i<d-1;i++){
C[k++] = B[i];
}
printf("%d\n",C[k/2]);
}
return 0;
}