数学建模社区-数学中国
标题:
看着车牌忽然想到一个题目,几次变化使之连续
[打印本页]
作者:
trytoday
时间:
2010-6-27 15:46
标题:
看着车牌忽然想到一个题目,几次变化使之连续
看着车牌忽然想到一个题目,细一想还挺难,不知道是否属于数论分类
+ g( L0 P0 {8 q' E, s. x1 {
" T+ c. C6 U% [- m! c
* C8 y2 F @. t# e
比如车牌398276,需要两次变化:把2变成4,3变成5,就成为完全连续的数字了。推广开来,一共有n个不重复的整数,最大不超过max,问需要最多几次变化可以使之全部连续。
$ z# ]! H0 B" M% m8 s% _3 l0 L
?9 I+ Z) U* T& N
例如上面车牌: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次,也就是说保留一个以外都得移动。
3 }5 ~3 |- t2 a3 U! I2 P
8 Q$ D, `3 `: }; c9 E' D; o
另外发现一个简化公式 n - (n*n/x)。用这个公式计算的结果在一些情况有少量误差。
2 W$ b. p+ H n) e. n$ R; y
我也没有标准答案来判断误差,只是用随机模拟的方式,对指定的 n x 随机几百次试验确定最有可能的值,以下是代码,效率一般,但n在1000以上几百次模拟也能在几秒内搞定:
+ j. C# f6 n4 i
8 l; d# Q) [' Q l
9 l1 J9 ^* K5 h2 v' v+ y
C#code:
3 z& |6 `9 }. u* {6 G! W
private void button1_Click(object sender, EventArgs e)
) w9 P0 L5 F- \/ N$ z W [6 I
{
- P8 ~% L) L+ H
//新的描述:编号 1 -- X 的停车位,随机停放 n 辆车,无论当前车辆怎样的位置,最少让多少辆车重新停放
T3 H/ W% o5 l8 R: W( l( a2 a
// 就可以使所有车辆连续停放
5 @5 M$ O% j4 e+ `
' r7 W, E4 E; Q) }6 R: U+ Z
int n = int.Parse(textBox1.Text);
8 S! ~# u$ @! h8 c% _4 _
int x = int.Parse(textBox2.Text);
- G3 Y+ k x1 Y$ \# b( ]
1 V: z! p7 a; l- p' V4 d
//500次随机模拟的最接近数字,对比公式计算
2 N( g4 ?& }6 I& Q) |' Y. ` m
int maxValue = 0;
, v! r K6 s" P# w9 ~. o) A' T3 q* N
for (int i = 0; i < 500; i++)
( p- X( e& h- i( a. @# a
{
* T% [* \0 I1 M6 U! q1 w( B
int value = randResult(x, n);
Z N( m* l+ e# V$ s) m9 b
if (maxValue < value) maxValue = value;
( Q% w( ?) b& u
lbMsg.Text = i.ToString();
5 T$ J1 v3 A7 u7 Y
lbMsg.Refresh();
* S" q/ H9 }" c5 Y
}
9 y) k0 S4 n4 r C: P a5 I/ x( `
textBox3.Text = maxValue.ToString();
1 P. E6 n6 K* V+ L/ ?" R$ K
) C2 V3 Y5 K' u
//这是公式计算的结果,据观察大部分正确,少数误差也不超过 3 :)
; H* c1 s- u: B3 d- y; E; u
double newValue = (double)n - ((n*n)/(double)x);
) w: m1 V3 W) z( s7 H/ J2 t
textBox4.Text = newValue.ToString();
: u a2 z- X# K* c7 Q7 F I7 L- ]* ^9 _
}
( {( E: A+ @, H' |
( u- S- o. C# N3 c+ r$ }
private int randResult(int max, int n)
4 T' A: \! h5 F9 R" R# }
{
( Y2 q) l' O: z
if(max <= n) return 0; //error
; {' d4 s [' _+ v: N/ ?
if (n < 3) return 0; //error
; s+ Q: G/ l8 B% s! J) {
if (max < 3) return 0; //error
! b8 Q% a" q1 ^4 f$ N) v" P1 X# ~6 z
+ u. B2 O# V3 [( f! K( Z# ]
int[] lib = new int[max + 1];
" J$ O3 q% w" K+ ~, F
//随机产生数字来填充
( Z, n7 E: a; k; @1 V
lib[1] = 1; lib[max] = 1;
: Y# L! o# L8 ?& T1 H _8 R6 z
int count = n - 2;
, [, D4 K& t/ L& M0 O/ A1 E0 F
Random rand = new Random();
8 v4 o; G# q3 f7 Z
while (count > 0)
$ z- Y' O O) p6 V% @- c# w
{
0 l0 f& X! r' N& \, Y _9 A
int rnd = rand.Next(1, max);
8 e2 n$ q! K- u2 r+ g( R! W
if (lib[rnd] == 0)
9 }, W W5 z, r4 f0 E" i; q
{
! x) n5 H Q* ~! _
lib[rnd] = 1;
: j/ i3 Y* P* {) F; F& V5 W3 \
count--;
, _/ q+ B' l! N. o3 m9 J3 a- U
}
# B/ `, c3 J; G. L0 z
}
+ D N; k/ G$ [( o5 Z* h0 g
//循环检查最密集区域,也就是需要移动最少的区域
% G- X0 `) N# o; a3 V9 [
int min_space = n;
9 X3 H5 e- k! ~+ r+ ]
for (int i = 1; i <= max - n + 1; i++)
6 ?% v7 w9 b/ G- ~/ w
{
* j# U5 ]: I2 w$ ?
int space = space_count(lib, i, n);
$ x7 e5 k) P8 X2 M1 [& X( C
if (min_space > space) min_space = space;
! ^$ O9 x, h! ?( y! P
}
! w2 C* C! S; E2 W2 B- o
return min_space;
5 A! v+ V* @, W* R {! F. n* j
}
6 k6 O$ A6 r! g$ x+ ?5 C
, P1 U9 R: @! E- S" ^0 L
private int space_count(int[] lib, int start, int n)
9 J- J7 d$ y- \2 _
{ //检查数组start后面n项数据里面有多少个1
J' x: o& d5 S) s u# A& x% j' J4 D/ `
int count = 0;
1 S) l# f5 U8 d- H) E! |* q
for (int i = start; i < start + n; i++) if (lib[i] == 0) count++;
' q5 _ h$ W3 C$ Z9 D# h
return count;
& O7 s8 D+ P, O
}
. a# P! ~2 G: W4 H8 N; W
作者:
bingcheers
时间:
2010-6-28 12:53
回复
trytoday
的帖子
; v& A1 x! i! i) }7 n
- l# e. l3 \% H. i
) s3 m' Z I- ?3 D. A* Q" g7 Q
牛牛, 牛牛, 牛牛
作者:
trytoday
时间:
2010-6-28 22:09
问题已经被另一位高人解决,请参阅:
9 w9 B" ~" z2 T, A8 {' {; n: O% ~7 P
http://topic.csdn.net/u/20100626 ... d-0495bbbb15fc.html
作者:
角凳
时间:
2010-9-7 20:20
好像不是很有意义...
欢迎光临 数学建模社区-数学中国 (http://www.madio.net/)
Powered by Discuz! X2.5