数学建模社区-数学中国
标题:
看着车牌忽然想到一个题目,几次变化使之连续
[打印本页]
作者:
trytoday
时间:
2010-6-27 15:46
标题:
看着车牌忽然想到一个题目,几次变化使之连续
看着车牌忽然想到一个题目,细一想还挺难,不知道是否属于数论分类
& b! v0 C, T8 U
- B! g# U0 q' y% V! q
3 d! j) z8 J* i$ z b
比如车牌398276,需要两次变化:把2变成4,3变成5,就成为完全连续的数字了。推广开来,一共有n个不重复的整数,最大不超过max,问需要最多几次变化可以使之全部连续。
# P: D1 J7 D# x- m2 m% e# @6 R
/ L7 l0 E' b0 o/ Q' f6 v( a
例如上面车牌:n=6个不重复整数,最大不超过max=10,需要最多3次变化使之全部连续。
作者:
linmatsas
时间:
2010-6-27 16:24
是最少需要几次变化吧…………
作者:
yupo_smart
时间:
2010-6-27 19:25
想法很好,可以好好考虑一下。
作者:
trytoday
时间:
2010-6-27 21:49
已经能够确定的是:如果 x > (n * (n-1) + 1),表示密度太‘稀’了,这种情况下必然是移动 n - 1次,也就是说保留一个以外都得移动。
) o+ }& P3 B- N1 n: X5 q
9 y' Y W$ p r3 o5 f
另外发现一个简化公式 n - (n*n/x)。用这个公式计算的结果在一些情况有少量误差。
: H7 C0 d8 s/ x3 w F% N
我也没有标准答案来判断误差,只是用随机模拟的方式,对指定的 n x 随机几百次试验确定最有可能的值,以下是代码,效率一般,但n在1000以上几百次模拟也能在几秒内搞定:
* k' D! i$ T, [ B5 Q, y2 \
5 Y7 Z6 Z/ n0 S. s/ x7 e0 s! x
" @( p: _+ p% a5 P6 P; Y* a$ T* T( }
C#code:
' L2 e, X0 l8 C
private void button1_Click(object sender, EventArgs e)
$ }. g; k! V# E% f% j! C
{
9 e/ S, h9 z* v& V3 C
//新的描述:编号 1 -- X 的停车位,随机停放 n 辆车,无论当前车辆怎样的位置,最少让多少辆车重新停放
- N$ j8 y, a5 ?6 N! h
// 就可以使所有车辆连续停放
% W) y5 t4 Q3 P. {
) c, r9 a* [) ]5 S) g" |
int n = int.Parse(textBox1.Text);
. k4 j( T/ f# J! X% F& x
int x = int.Parse(textBox2.Text);
# S6 v- x, A% k
0 i0 ~) \" G8 O) I4 j
//500次随机模拟的最接近数字,对比公式计算
+ q7 Z0 t: m2 T* u. B: g; M C5 g
int maxValue = 0;
$ ?! z3 W7 M7 s
for (int i = 0; i < 500; i++)
7 f8 H1 y, l0 X, y) X
{
9 n' y j l6 p* D8 Y0 V, n& d
int value = randResult(x, n);
, D- h6 ~0 Z+ D" {8 o+ w5 L$ L* s
if (maxValue < value) maxValue = value;
9 E% I9 U5 }: J& U9 v, r4 p
lbMsg.Text = i.ToString();
8 l) }. ~$ h4 T
lbMsg.Refresh();
% u& E% R# U$ [. N" o
}
# B$ u( _+ a( P1 A8 R1 W: Z- F- {" {- ?
textBox3.Text = maxValue.ToString();
* ^& E; f9 K6 N+ w" Y, G" x
$ a) p! M4 Y3 v( C% x
//这是公式计算的结果,据观察大部分正确,少数误差也不超过 3 :)
5 e4 G! {' T, W5 v9 M9 x
double newValue = (double)n - ((n*n)/(double)x);
$ ] P0 i1 a( u: G) J
textBox4.Text = newValue.ToString();
/ b. Z& j/ c' I* R: K7 ?
}
3 U" [+ O6 w* h: p7 J$ V% v. u" b
' q6 Y# S+ m! p9 b# m* t/ m& Z1 d# a1 ~
private int randResult(int max, int n)
# j8 c* c& B) w' H; |
{
9 E6 j, F4 e4 j! f) w9 p' T4 w
if(max <= n) return 0; //error
/ K* t1 W8 k4 a
if (n < 3) return 0; //error
& ~ |8 @9 r# a ]" c5 T6 `9 A
if (max < 3) return 0; //error
9 H! ]5 A/ L' X- X+ F' c" d
! Z! q \# Q. D" k5 O1 E' f% `
int[] lib = new int[max + 1];
1 ]0 a. g; Q) F9 t3 s9 m
//随机产生数字来填充
% Q( a; `# m. a4 c7 @$ W% \
lib[1] = 1; lib[max] = 1;
! ]0 G+ x: w( a0 G
int count = n - 2;
) K& g9 {2 b7 |: |; e; M) r% I
Random rand = new Random();
& _. N0 u t8 A, i$ M& D0 n/ G$ ~7 Z
while (count > 0)
. V; K; y& l9 \& c/ o
{
1 H( O0 q0 Q9 E
int rnd = rand.Next(1, max);
( t4 { i8 g; ^
if (lib[rnd] == 0)
: ~- G* P o+ W, Z) v- e2 u" @
{
3 C6 x3 o& |- |! Y; Q0 F' K; }
lib[rnd] = 1;
) A+ D- R7 \- G1 d
count--;
6 {) T5 Q! L0 X* |- E- l6 V( a6 Q
}
7 S# x- b; g) K# s# v( R/ O0 }5 `
}
! K; a: U3 \" F. U/ K9 T& z k
//循环检查最密集区域,也就是需要移动最少的区域
, I4 j; X: f# g% l+ T# ?
int min_space = n;
; `6 ]' i. f" T* u* P; ^) C
for (int i = 1; i <= max - n + 1; i++)
3 o; U% E: l9 L0 j. Q- Z
{
6 |- j4 ^/ {- p, [0 L" _
int space = space_count(lib, i, n);
$ T% E9 a" I7 j! V5 `" F
if (min_space > space) min_space = space;
; h+ y. v9 n* m$ W- Y+ a$ ~( m
}
/ m8 o( z7 s6 M4 T
return min_space;
4 v) k( P5 q" l
}
) L' R: H/ Y! ^/ }, v$ N* K g0 f
5 ^$ e5 U8 Q& e8 c
private int space_count(int[] lib, int start, int n)
8 t+ u8 s3 G. y1 U4 c1 M+ J" g8 ?
{ //检查数组start后面n项数据里面有多少个1
0 l& m9 v1 P: y6 @+ ]9 R' `1 s
int count = 0;
0 q+ n g2 w# \9 L+ Q9 D. l
for (int i = start; i < start + n; i++) if (lib[i] == 0) count++;
# J7 P5 d5 @; g8 e* z. y
return count;
% }9 f2 p: n$ V6 _7 G
}
- D& }2 B% f" o
作者:
bingcheers
时间:
2010-6-28 12:53
回复
trytoday
的帖子
9 I- e. U8 P1 ], ?& k/ [* ]. W
/ S6 w9 H. |6 |3 }+ I
+ `" B" P5 ?9 k/ K! Q# Q% \$ m
牛牛, 牛牛, 牛牛
作者:
trytoday
时间:
2010-6-28 22:09
问题已经被另一位高人解决,请参阅:
, I' J d! R6 H5 O. \& S
http://topic.csdn.net/u/20100626 ... d-0495bbbb15fc.html
作者:
角凳
时间:
2010-9-7 20:20
好像不是很有意义...
欢迎光临 数学建模社区-数学中国 (http://www.madio.net/)
Powered by Discuz! X2.5