这暴力循环居然过了,就是7个超时。。求大佬改进(C)

P1678 烦恼的高考志愿

老师说要2分
by 守护 @ 2017-09-28 21:58:02


233333
by Tsukimaru @ 2017-09-28 21:58:40


@[cutekibry](/space/show?uid=45398) 额
by 守护 @ 2017-09-28 21:58:58


能改进的可能不大,最好老老实实二分吧,又不是特别难的代码
by Victorique @ 2017-09-28 21:59:44


#7个超时叫过了,无言以对
by __世界第一弱__ @ 2017-09-28 22:00:38


@[吉尔伽美什](/space/show?uid=49223) 老师没教叫我自己看。。。。
by 守护 @ 2017-09-28 22:00:06


@[世界第一弱](/space/show?uid=24397) 我说数据
by 守护 @ 2017-09-28 22:01:24


```cpp #include <stdio.h> #include <stdlib.h> void select_sort(long long* arr,int n) //选择排序,基于数组 { for(int i = 0;i < n - 1;i++) { int position = i; for(int j = i+1;j < n;j++) { if(arr[j] < arr[position]) { position = j; } } if(position == i) { continue; } long long middle = arr[position]; arr[position] = arr[i]; arr[i] = middle; } } int absolute(int a) { if(a >= 0) { return a; } if(a < 0) { return -a; } return 0; } int find_min(const long long* arr,int len,int val) //查找范围,范围长度,待查找变量 (bug) { long long min = 99999999; int middle = 0; int low = 0; int high = len - 1; while(low <= high) { middle = (low + high)/2; long long middle_val = arr[middle]; middle_val = middle_val - val; middle_val = absolute(middle_val); if(middle_val < min) { min = middle_val; } int last = middle - 1; //判断上一个的差值 long long last_val = arr[last]; last_val = last_val - val; last_val = absolute(last_val); int next = middle + 1;//判断下一个的差值 long long next_val = arr[next]; next_val = next_val - val; next_val = absolute(next_val); if(last_val < min) //如果上个差值比这个小 { if(next_val < last_val) { min = next_val; low = middle + 1; continue; } min = last_val; high = middle - 1; continue; } if(next_val < min) { if(last_val < next_val) { min = last_val; high = middle - 1; continue; } min = next_val; low = middle + 1; continue; } /* int next = middle + 1;//判断下一个的差值 long long next_val = arr[next]; next_val = next_val - val; next_val = absolute(next_val); if(next_val < min)//如果下一个差值比这个小 { min = next_val; low = middle + 1; continue; }*/ return min; //返回最小差值 } } int main() //已测试,没问题 { int m,n; scanf("%d %d",&m,&n); long long* dataSchool = (long long*)malloc(m*8); for(int i = 0;i < m;i++) { scanf("%d",&dataSchool[i]); } select_sort(dataSchool,m); long long count = 0; for(int i = 0;i < n;i++) { long long now; scanf("%d",&now); count = count + find_min(dataSchool,m,now); } printf("%d",count); return 0; } 我也求救下... ```
by _KaQqi @ 2017-12-09 19:30:28


|