九度OJ 1097 取中值

来源:互联网 发布:翻墙软件一点通 编辑:程序博客网 时间:2024/06/06 09:34
题目描述:

     存在两组数组,和4个数字a,b,c,d,要求做如下操作,将第一个数组第a个数到第b个数,第二个数组的第c个数到第d个数放到一个数组中,求出合并后数组的中间值,如果有两个中间值,取下标较小的那个。

输入:

    第一行一个整数t表示有t个测试数据
    第二行两个整数,表示两个数组的长度,
    接下来两行表示两个数字的值,

    最后一行有四个整数a,b,c,d。

    数组长度不会超过1000000。

输出:

    每行一个整数,对应合并数组的下标在中间的那个值。

样例输入:
15 41 2 3 4 56 7 8 91 21 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;}


0 0
原创粉丝点击