69,371
社区成员
发帖
与我相关
我的任务
分享
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <limits.h>
#define swap(m, n) do {int r = m; m = n; n = r;} while(0)
int gcd(int m, int n)
{
int r;
if(m < n) swap(m, n);
if(n == 0) return m;
while((r = (m % n)))
{
m = n;
n = r;
}
return n;
}
#define MAX_ITEMS (1000)
int a[] = {4, 8, 12, 14, 16, 20, 30, 32, 34, 35, 36};
static inline int calc_min_steps(int dst, int N, int * min_steps, int * X)
{
if(N < 1) exit(1); // invalid parameter
// 计算数组个元素与目标值的偏差
int i;
int steps;
int diffs[MAX_ITEMS];
int x = 0;
for(i = 0; i < N; ++i)
{
diffs[i] = abs(a[i] - dst);
if(x == 0 && diffs[i]) x = diffs[i];
}
// 计算偏差值的最大公约数 x
//~ x = diffs[0];
for(i = 1; i < N; ++i)
{
if(diffs[i]) // 仅计算偏差值不为0的情况
{
x = gcd(x, diffs[i]);
}
}
// 计算步数
if(x == 0) // 只有一个元素的情况,或所有元素均为0的情况,此时不需要执行任何步骤
{
* min_steps = 0;
* X = x;
return 0;
}
steps = 0;
for(i = 0; i < N; ++i)
{
steps += diffs[i] / x;
}
* min_steps = steps;
*X = x;
return 0;
}
void exhaustive_method()
{
int N = (int)(sizeof(a) / sizeof(a[0]));
int dst;
int steps;
int x;
int min = INT_MAX;
int min_dst = INT_MAX;
int min_x = INT_MAX;
printf(" N = %d\n", N);
//~ return 0;
for(dst = a[0]; dst <= a[N - 1]; ++dst)
{
steps = 0;
calc_min_steps(dst, N, &steps, &x);
printf("dst = %d, ", dst);
if(steps < min)
{
min = steps;
min_dst = dst;
min_x = x;
}
printf("x = %d: steps = %d\n", x, steps);
}
printf("min steps = %d, min_dst = %d, min_x = %d\n", min, min_dst, min_x);
}
void fast_method()
{
int N = (int)(sizeof(a) / sizeof(a[0]));
int mid_pos = (N + 1) / 2 - 1;
int min_steps = 0;
int X = 0;
int min_dst = a[mid_pos];
calc_min_steps(min_dst, N, &min_steps, &X);
//~ printf("min steps = %d, min_dst = %d, min_x = %d\n", min_steps, min_dst, X);
if((N & 0x01) == 0) // N 为偶数时有两个中位数,需要多检查一个中位数
{
int steps = INT_MAX;
int x = INT_MAX;
int dst = a[mid_pos + 1];
calc_min_steps(dst, N, &steps, &x);
if(steps < min_steps)
{
min_dst = dst;
min_steps = steps;
X = x;
}
}
printf("N = %d, min_steps = %d, min_dst = %d, min_x = %d\n", N, min_steps, min_dst, X);
}
int main(int argc, char **argv)
{
exhaustive_method();
printf("==== fast_methos ====\n");
fast_method();
return 0;
}
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <limits.h>
static inline void swap(int m, int n)
{
int r = m;
m = n;
n = r;
}
int gcd(int m, int n)
{
int r;
if(m < n) swap(m, n);
while((r = (m % n)))
{
m = n;
n = r;
}
return n;
}
#define MAX_ITEMS (1000)
int a[] = {4, 8, 12, 13, 15, 16, 18, 20, 30, 32};
static inline int calc_min_steps(int dst, int N, int * min_steps, int * X)
{
if(N < 1) exit(1); // invalid parameter
// 计算数组个元素与目标值的偏差
int i;
int steps;
int diffs[MAX_ITEMS];
int x = 0;
for(i = 0; i < N; ++i)
{
diffs[i] = abs(a[i] - dst);
}
// 计算偏差值的最大公约数 x
x = diffs[0];
for(i = 1; i < N; ++i)
{
if(diffs[i]) // 仅计算偏差值不为0的情况
{
x = gcd(x, diffs[i]);
}
}
// 计算步数
if(x == 0) // 只有一个元素的情况,或所有元素均为0的情况,此时不需要执行任何步骤
{
* min_steps = 0;
* X = x;
return 0;
}
steps = 0;
for(i = 0; i < N; ++i)
{
steps += diffs[i] / x;
}
* min_steps = steps;
*X = x;
return 0;
}
void exhaustive_method()
{
int N = (int)(sizeof(a) / sizeof(a[0]));
int dst;
int steps;
int x;
int min = INT_MAX;
int min_dst = INT_MAX;
int min_x = INT_MAX;
printf(" N = %d\n", N);
//~ return 0;
for(dst = a[0]; dst <= a[N - 1]; ++dst)
{
steps = 0;
calc_min_steps(dst, N, &steps, &x);
printf("dst = %d, ", dst);
if(steps < min)
{
min = steps;
min_dst = dst;
min_x = x;
}
printf("x = %d: steps = %d\n", x, steps);
}
printf("min steps = %d, min_dst = %d, min_x = %d\n", min, min_dst, min_x);
}
void fast_method()
{
int N = (int)(sizeof(a) / sizeof(a[0]));
int mid_pos = (N + 1) / 2 - 1;
int min_steps = 0;
int X = 0;
int min_dst = a[mid_pos];
calc_min_steps(min_dst, N, &min_steps, &X);
//~ printf("min steps = %d, min_dst = %d, min_x = %d\n", min_steps, min_dst, X);
if((N & 0x01) == 0) // N 为偶数时有两个中位数,需要多检查一个中位数
{
int steps = INT_MAX;
int x = INT_MAX;
int dst = a[mid_pos + 1];
calc_min_steps(dst, N, &steps, &x);
if(steps < min_steps)
{
min_dst = dst;
min_steps = steps;
X = x;
}
}
printf("N = %d, min_steps = %d, min_dst = %d, min_x = %d\n", N, min_steps, min_dst, X);
}
int main(int argc, char **argv)
{
exhaustive_method();
printf("==== fast_methos ====\n");
fast_method();
return 0;
}