- 題目描述:
-
存在兩組數組,和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
這道題不怎麼難,直接開數組進行移動數據就可以了,可是這道題裏我犯了一個錯誤,導致困了7個小時,愣是沒發現,太水啊!先貼上TLE的代碼:
#include<stdio.h> #include<stdlib.h> int a[100000],b[100000],c[100000]; int main() { int t,m,n,i,j,t1,t2,t3,t4,x,y,z,u; while(~scanf("%d",&t)) { for(i= 0; i < t; i++) { scanf("%d%d",&m,&n); for(i = 0; i < m; i++) scanf("%d",&a[i]); for(j = 0; j < n; j++) scanf("%d",&b[j]); scanf("%d%d%d%d",&t1,&t2,&t3,&t4); x = t2 - t1 + 1; y = t4 - t3 + 1; u = x + y; for(i = 0,j = t1 - 1;j <= t2; i++,j++) c[i]= a[j]; for(i = x,j = t3 - 1; j <= t4; i++,j++) c[i] = b[j]; z = (u % 2 == 0) ? (u / 2 - 1) : (u / 2); printf("%d\n",c[z]); } } //system("pause"); return 0; } 以上是超時的代碼,但是在我本人的DEV-C++上運行結果完全正確。那個糾結啊,看了好久未果,不知道錯了多少次了,最後 發現是這兒的問題: for(i = 0; i < t; i++) { scanf("%d%d",&m,&n); for(i = 0; i < m; i++) 原來是變量使用的問題,內部循環裏有一個i++,這使得程序老是超時,最後改了,果斷AC,這是第一次碰到變量是用導致程序 出錯,雖然是很水的錯誤,可是還是想寫下來,做個教訓吧 下面貼上正確代碼: #include<stdio.h> #include<stdlib.h> int a[100000],b[100000],c[100000]; int main() { int t,m,n,i,j,k,t1,t2,t3,t4,x,y,z,u; while(~scanf("%d",&t)) { for(i = 0; i < t; i++) { scanf("%d%d",&m,&n); for(k= 0; k < m; k++) scanf("%d",&a[k]); for(j = 0; j < n; j++) scanf("%d",&b[j]); scanf("%d%d%d%d",&t1,&t2,&t3,&t4); x = t2 - t1 + 1; y = t4 - t3 + 1; u = x + y; for(k = 0,j = t1 - 1;j <= t2; k++,j++) c[k] = a[j]; for(k = x,j = t3 - 1; j <= t4; k++,j++) c[k] = b[j]; z = (u % 2 == 0) ? (u / 2 - 1) : (u / 2); printf("%d\n",c[z]); } } //system("pause"); return 0; }