笔试过的一道逻辑题

CowardlyLion 2009-06-23 10:38:40
加精
今天在某公司做的笔试题,如下:

007有个闹钟,有一个分针键和一个时针键。按一次时针键,闹钟时间往前走一小时;按分针键,闹钟时间往前走一分钟。最差情况下,007需要按59次分针键才能调到想设置的闹钟时刻。007想改进一下,于是加了一个魔术键。每按一次该建,闹钟时刻的分针往前走N分钟。试问,最差情况下,N为几时,按键次数最少。写出按键的序列。

假设第一次按魔术键,闹钟时刻的分针往前走N分钟;第二次按魔术键,闹钟时刻的分针往前走M分钟;第三次按魔术键,闹钟时刻的分针往前走N分钟;第四次按魔术键,闹钟时刻的分针往前走M分钟。依此类推,试问最差情况下,M ,N为几时,按键次数最少。写出按键的序列。

没分了,大家踊跃啊!
...全文
304 128 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
128 条回复
切换为时间正序
请发表友善的回复…
发表回复
jiang5495 2009-07-15
  • 打赏
  • 举报
回复
路过,学习
wusong0 2009-07-11
  • 打赏
  • 举报
回复
N为什么要小于10呢???
wusong0 2009-07-11
  • 打赏
  • 举报
回复
[Quote=引用楼主 troyaninpc 的帖子:]
今天在某公司做的笔试题,如下:

007有个闹钟,有一个分针键和一个时针键。按一次时针键,闹钟时间往前走一小时;按分针键,闹钟时间往前走一分钟。最差情况下,007需要按59次分针键才能调到想设置的闹钟时刻。007想改进一下,于是加了一个魔术键。每按一次该建,闹钟时刻的分针往前走N分钟。试问,最差情况下,N为几时,按键次数最少。写出按键的序列。

假设第一次按魔术键,闹钟时刻的分针往前走N分钟;第二次按魔术键…
[/Quote]
什么是最差情况呀!!!!!
问题就问的不明确。。。。
如果最差情况是差59分我把n设置为59一下就完了。。。
而且问题里的时针根本用不到呀!!!!
zxfjava2009 2009-07-01
  • 打赏
  • 举报
回复
没看太懂啊!! 看数学知识太溃乏了啊!!!!
hey2009 2009-06-26
  • 打赏
  • 举报
回复
还有:
N=10,M=9 数56需要的按键次数:13为最差情况
10+9+10+9+10+1+1+1+1+1+1+1+1
qq276402087 2009-06-26
  • 打赏
  • 举报
回复
帮顶
hey2009 2009-06-26
  • 打赏
  • 举报
回复
public class Test {
public static void main(String[] args) {
question1();
question2();
}
static void question1(){
int k = 59;
for(int i = 2;i< 59;i++){//i表示魔术键代表的值
int result = 59;
int num=0;//按魔术键的按键次数
int yiNum = 0;//分针键的按键次数
int result1 =0;
int result2 = 0;
//以i为单元

//当具有最大单元个数时,即要使按键次数最大则该值为59
num=59/i;
yiNum = 59%i;
result1 = num+yiNum;

//当数值为(59/i)*i-1时,也有可能使按键次数最大
num = 59/i-1;
yiNum = i - 1;
result2 = num+yiNum;
//比较出特定i下,按键的最大次数
result = result1>result2?result1:result2;
//比较所有i下,按键的最大次数
if(result<k){
k=result;
}
}
/*
* ####################输出结果###########################
*/
for(int i = 2;i< 59;i++){
int result = 59;
int num=0;//按魔术键的按键次数
int yiNum = 0;//分针键的按键次数
int result1 =0;
int result2 = 0;
//以i为单元

//当具有最大单元个数时,即要使按键次数最大则该值为59
num=59/i;
yiNum = 59%i;
result1 = num+yiNum;

//当数值为(59/i)*i-1时,也有可能使按键次数最大
num = 59/i-1;
yiNum = i - 1;
result2 = num+yiNum;
//比较出特定i下,按键的最大次数
result = result1>result2?result1:result2;

if(result == k){
if(k==result1){
num=59/i;
yiNum = 59%i;
}
if(k==result2){
num = 59/i-1;
yiNum = i - 1;
}
System.out.print("N="+i+"要按魔术键:"+num+"次,");
System.out.print("按分钟键:"+(i-1)+"次,");
System.out.println("总的按键次数:"+(num+i-1)+";对应的数为:"+(num*i+i-1));
}
}
}

static void question2(){
int k = 59;
//取值
for(int m = 1;m< 59;m++){
int tempK = 59;
for(int n = 1;n< 59;n++){
int result1 = 0;
int result2 = 0;
int result3 = 0;
int nNum=0;//奇数次按魔术键的按键次数
int mNum=0;//偶数次按魔术键的按键次数
int yiNum = 0;//分针键的按键次数

//以m+n为处理单元,

//结果一:当数值为59,有可能使按键次数最大
nNum = 59/(m+n);
mNum = 59/(m+n);
if(59%(m+n)>n){ //当nNum=mNum+1时
nNum = nNum+1;
}
yiNum = 59%(m+n);
result1 = mNum+nNum+yiNum;

//当数值为(59/(m+n))*(m+n)-1时,也有可能使按键次数最大
nNum = 59/(m+n);
mNum = 59/(m+n)-1;
yiNum = m-1;
result2 = mNum+nNum+yiNum;

//当数值为(59/(m+n))*(m+n)-m-1时,也有可能使按键次数最大
nNum = 59/(m+n)-1;
mNum = 59/(m+n)-1;
yiNum = n-1;
result3 = mNum+nNum+yiNum;

//比较上面三个结果,取最大值(即得到在最差情况下,敲击次数)
int result = result1>result2?result1:result2;
result = result3>result?result3:result;
if(result<tempK){
tempK = result;
}
}
if(tempK<k){
k=tempK;
}
}
/*
* ####################输出结果###########################
*/
for(int m = 1;m< 59;m++){
for(int n = 1;n< 59;n++){
int result1 = 0;
int result2 = 0;
int result3 = 0;
int nNum=0;//奇数次按魔术键的按键次数
int mNum=0;//偶数次按魔术键的按键次数
int yiNum = 0;//分针键的按键次数

//以m+n为处理单元,

//结果一:当数值为59,有可能使按键次数最大
nNum = 59/(m+n);
mNum = 59/(m+n);
if(59%(m+n)>n){ //当nNum=mNum+1时
nNum = nNum+1;
}
yiNum = 59%(m+n);
result1 = mNum+nNum+yiNum;

//当数值为(59/(m+n))*(m+n)-1时,也有可能使按键次数最大
nNum = 59/(m+n);
mNum = 59/(m+n)-1;
yiNum = m-1;
result2 = mNum+nNum+yiNum;

//当数值为(59/(m+n))*(m+n)-m-1时,也有可能使按键次数最大
nNum = 59/(m+n)-1;
mNum = 59/(m+n)-1;
yiNum = n-1;
result3 = mNum+nNum+yiNum;

//比较上面三个结果,取最大值(即得到在最差情况下,敲击次数)
int result = result1>result2?result1:result2;
result = result3>result?result3:result;
if(result==k){
if(result==result1){
nNum = 59/(m+n);
mNum = 59/(m+n);
if(59%(m+n)>n){ //当nNum=mNum+1时
nNum = nNum+1;
}
yiNum = 59%(m+n);
}
if(result==result2){
nNum = 59/(m+n);
mNum = 59/(m+n)-1;
yiNum = m-1;
}
if(result==result3){
nNum = 59/(m+n)-1;
mNum = 59/(m+n)-1;
yiNum = n-1;
}
System.out.println("N="+n+",M="+m+" 数"+(mNum*m+n*nNum+yiNum)+"需要的按键次数:"+(result)+"为最差情况");
StringBuffer ex = new StringBuffer("");
for(int p = 0;p< mNum;p++){
ex.append(n+"+"+m+"+");
}
if(nNum!=mNum){
ex.append(+n+"+");
}
for(int p = 0;p< yiNum;p++){
ex.append(1+"+");
}
ex.deleteCharAt(ex.length()-1);
System.out.println(ex.toString());
}

}

}

}
}

测试结果:

N=7要按魔术键:7次,按分钟键:6次,总的按键次数:13;对应的数为:55
N=8要按魔术键:6次,按分钟键:7次,总的按键次数:13;对应的数为:55
N=9要按魔术键:5次,按分钟键:8次,总的按键次数:13;对应的数为:53
N=8,M=6 数49需要的按键次数:13为最差情况
8+6+8+6+8+6+1+1+1+1+1+1+1
N=7,M=7 数55需要的按键次数:13为最差情况
7+7+7+7+7+7+7+1+1+1+1+1+1
N=10,M=8 数45需要的按键次数:13为最差情况
10+8+10+8+1+1+1+1+1+1+1+1+1
N=9,M=9 数53需要的按键次数:13为最差情况
9+9+9+9+9+1+1+1+1+1+1+1+1
N=10,M=9 数47需要的按键次数:13为最差情况
10+9+10+9+1+1+1+1+1+1+1+1+1


ibone 2009-06-26
  • 打赏
  • 举报
回复
[Quote=引用 114 楼 GibGas 的回复:]
引用 112 楼 caomeiliang 的回复:
引用 111 楼 GibGas 的回复:
引用 108 楼 caomeiliang 的回复:
引用 106 楼 zhaoyong209 的回复:
第一题,粗算一下,最短次数为12次,此时魔术键设为14分钟。
加1-9分钟时,需按分钟1-9次。 <=12次
加10-13分钟时,需按魔术键5次,分钟0-3次,总共5-8次。 <=12次
加14-23分钟时,需按魔术键1次,分钟0-9次,总共1-10次。 <=12次
加24-27分钟时,需按魔术键6次,分钟0-3次,总共6…
[/Quote]

我就想知道you是中国人 or not
这种学习英文的方法不错 呵呵
可惜我水平不够 怕笑话

I wonder that weather you are a chinese.
This kind of learning method is helpful and funny.
But I afried of being laugh at.
(Chnglish haha)
HappyKeKe 2009-06-26
  • 打赏
  • 举报
回复
额...题目俺都没看懂....
Freeid_shi 2009-06-26
  • 打赏
  • 举报
回复
create table #temps (n int,i int,j int,h int,k int)
declare @N int declare @i int declare @j int declare @k int declare @h int
set @N=2
set @i=0
set @j=0
set @k=59
while (@N>1) and (@N<60)
begin
while (@i>=0) and (@i<31)
begin
while (@j>=0 and @j<60)
begin
set @k=@N*@i+@j
if (@k>0 and @k<60)
insert into #temps select @N as N,@i as i,@j as j,@i+@j,@k
--print 'N='+cast(@N as varchar(2))+char(32)+'i='+cast(@i as varchar(2))+char(32)+'j='+cast(@j as varchar(2))+char(32)+'j+i='+cast(@j+@i as varchar(2))
set @j=@j+1
end
set @i=@i+1
set @j=0
end
set @N=@N+1
set @i=0
end
select a.n,max(a.h) from
(select n,k,min(h) as h from #temps group by n,k) a group by a.n order by max(a.h),a.n
drop table #temps

7 13
8 13
9 13
6 14
10 14
11 14
5 15
12 15
13 15
14 16
4 17
15 17
16 17
17 18
18 19
19 20
3 21
20 21
21 21
22 22
23 23
24 24
25 25
26 26
27 27
28 28
29 29
2 30
30 30
31 30
32 31
33 32
34 33
35 34
36 35
37 36
38 37
39 38
40 39
41 40
42 41
43 42
44 43
45 44
46 45
47 46
48 47
49 48
50 49
51 50
52 51
53 52
54 53
55 54
56 55
57 56
58 57
59 58
Freeid_shi 2009-06-26
  • 打赏
  • 举报
回复
mark
云霄飞车 2009-06-26
  • 打赏
  • 举报
回复
虎滴小猪猪 2009-06-25
  • 打赏
  • 举报
回复
有最终答案吗?
Fyu90 2009-06-25
  • 打赏
  • 举报
回复
顶啊!我数学也差上天啊
CowardlyLion 2009-06-25
  • 打赏
  • 举报
回复
[Quote=引用 26 楼 HimeTale 的回复:]
开平方,开立方
假如分成n分,有m个魔术键,那就是n开(m+1)次方

一个魔术键:8
二个魔术键:4
[/Quote]理由?
CowardlyLion 2009-06-25
  • 打赏
  • 举报
回复
LS用程序的话那也是穷举了,没有更妙的思路吗?
我感觉设置M N值时,两数的和K值是线性增长的,即所要按的分钟键数也是线性增长的;而K值与魔术键按键次数x的关系是在 f(k)=60/k-1与x轴整数集合的交集上。
高中数学基本上忘没了,算了。再观望几天,结贴了。
HimeTale 2009-06-25
  • 打赏
  • 举报
回复
[Quote=引用 81 楼 jiyan1221 的回复:]
當M=2,N=2的時候,需要的最少次數為:30.此時的分鐘值為:59
當M=2,N=3的時候,需要的最少次數為:25.此時的分鐘值為:59
當M=2,N=4的時候,需要的最少次數為:22.此時的分鐘值為:59
當M=2,N=5的時候,需要的最少次數為:19.此時的分鐘值為:55
當M=2,N=6的時候,需要的最少次數為:18.此時的分鐘值為:55
當M=2,N=7的時候,需要的最少次數為:17.此時的分鐘值為:53
當M=2,N=8的時候,需要的最少次數為:18.此時的分鐘值為…
[/Quote]
试了这么长一大坨
这么多你怎么不试试26楼的标准答案?

4,16
ITBedlamite 2009-06-25
  • 打赏
  • 举报
回复
RealStalish 2009-06-25
  • 打赏
  • 举报
回复
这题不错
wangwen1 2009-06-25
  • 打赏
  • 举报
回复
太难啦,做出不来
加载更多回复(107)

81,122

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧