网上没找到答案的逻辑推理题
今天去一家游戏公司面试,这一题没推出来。在网上也没找到合理的答案。只能劳烦大家了。请大家不要用穷举法,如果知道答案请将推理过程写出来。谢了。
甲、乙、丙三队互相比赛,每两队之间都比赛了同样多的场数,然后根据得分的多少,决定哪一队是最后的胜利者。规则是每场比赛,胜者得3分,负者得0分,平局各得1分。
甲队在全部比赛结束之后,得意洋洋的说:“我们队赢的场数比你们两队中的任何一队都多。”
乙队反唇相击,道:“我们队输的场数比你们两队中的任何一队都少。”
唯有丙队发言人一声不吭。
你认为丙队会排名第一吗?
注意:甲、乙、丙三队,每两队之间的比赛场数可以不止一场。 甲、乙、丙三队互相比赛,每两队之间都比赛了同样多的场数,然后根据得分的多少,决定哪一队是最后的胜利者。规则是每场比赛,胜者得3分,负者得0分,平局各得1分。
甲队在全部比赛结束之后,得意洋洋的说:“我们队赢的场数比你们两队中的任何一队都多。”
乙队反唇相击,道:“我们队输的场数比你们两队中的任何一队都少。”
唯有丙队发言人一声不吭。
你认为丙队会排名第一吗?
注意:甲、乙、丙三队,每两队之间的比赛场数可以不止一场。public class Test {
public static void main(String [] args){
TeamObj a = new TeamObj();//A队
TeamObj b = new TeamObj();//B队
TeamObj c = new TeamObj();//C队
int roundNum = 1;//回合数
/*
* 下面的纯粹就是按照题意所写的判断 不精湛 粗略的理解为a是必须赢数多.但不一定不输,
* b必须是输数少,但不一定去赢,c是积分一定要高,但一定要让A,B两组积分低的情况下不影响战绩..全是废话
*/
for(int i = 0 ; i < roundNum ; i ++){
if(a.getWinNum() <= b.getWinNum()
|| a.getWinNum() <= c.getWinNum()){
a.setWinNum(a.getWinNum() + 1);
a.setMin(a.getMin() + 2);
if(b.getLoseNum() - c.getLoseNum() > 1){
b.setLoseNum(b.getLoseNum() + 1);
}else{
c.setLoseNum(c.getLoseNum() + 1);
}
}else if(b.getLoseNum() >= c.getLoseNum()){
b.setWinNum(b.getWinNum() + 1);
b.setMin(b.getMin() + 2);
if(a.getWinNum() - b.getWinNum() > 1){
a.setLoseNum(a.getLoseNum() + 1);
}else{
c.setLoseNum(c.getLoseNum() + 1);
}
}else if(b.getLoseNum() >= a.getLoseNum()){
b.setWinNum(b.getWinNum() + 1);
b.setMin(b.getMin() + 2);
a.setLoseNum(c.getLoseNum() + 1);
}else if(c.getMin() <= a.getMin() || c.getMin() <= b.getMin()){
c.setWinNum(c.getWinNum() + 1);
c.setMin(c.getMin() + 2);
if(a.getWinNum() - c.getWinNum() > 1){
a.setLoseNum(a.getLoseNum() + 1);
}else if(b.getLoseNum() - c.getLoseNum() > 1){
b.setLoseNum(b.getLoseNum() + 1);
}else{
c.setDrawNum(b.getDrawNum() + 1);
c.setMin(c.getMin() + 1);
if(b.getMin() > a.getMin()){
a.setMin(a.getMin() + 1);
a.setDrawNum(a.getDrawNum() + 1);
}else{
b.setMin(b.getMin() + 1);
b.setDrawNum(b.getDrawNum() + 1);
}
}
}
if((a.getWinNum() > c.getWinNum() && a.getWinNum() > b.getWinNum())
&& (b.getLoseNum() < a.getLoseNum() && b.getLoseNum() < c.getLoseNum() )
&& (c.getMin() > a.getMin() && c.getMin() > b.getMin()) ){
System.out.println("a win :" + a.getWinNum() + " lose :" + a.getLoseNum() + " drawnum :" + a.getDrawNum() + " min :" + a.getMin());
System.out.println("b win :" + b.getWinNum() + " lose :" + b.getLoseNum() + " drawnum :" + b.getDrawNum() + " min :" + b.getMin());
System.out.println("c win :" + c.getWinNum() + " lose :" + c.getLoseNum() + " drawnum :" + c.getDrawNum() + " min :" + c.getMin());
System.out.println("roundNum : " + roundNum);
break;
}else{
System.out.println("a win :" + a.getWinNum() + " lose :" + a.getLoseNum() + " drawnum :" + a.getDrawNum() + " min :" + a.getMin());
System.out.println("b win :" + b.getWinNum() + " lose :" + b.getLoseNum() + " drawnum :" + b.getDrawNum() + " min :" + b.getMin());
System.out.println("c win :" + c.getWinNum() + " lose :" + c.getLoseNum() + " drawnum :" + c.getDrawNum() + " min :" + c.getMin());
System.out.println("-------------------------------------------------------");
roundNum ++ ;
}
}
}
}
那个队伍对象就不写了
楼上说的对先用方程式找好数据之间的关系.然后列出来.在解出来就不难了..我这小白代码只是看下..package filter;public class TeamObj {private int min;private int winNum;private int loseNum;private int drawNum;public int getMin() {return min;}public void setMin(int min) {this.min = min;}public int getWinNum() {return winNum;}public void setWinNum(int winNum) {this.winNum = winNum;}public int getLoseNum() {return loseNum;}public void setLoseNum(int loseNum) {this.loseNum = loseNum;}public int getDrawNum() {return drawNum;}public void setDrawNum(int drawNum) {this.drawNum = drawNum;}}
重新发.../** * * @author q472732639 * */public class Test {public static void main(String [] args){TeamObj a = new TeamObj();//A队TeamObj b = new TeamObj();//B队TeamObj c = new TeamObj();//C队int roundNum = 1;//回合数/* * 下面的纯粹就是按照题意所写的判断 不精湛 粗略的理解为a是必须赢数多.但不一定不输, * b必须是输数少,但不一定去赢,c是积分一定要高,但一定要让A,B两组积分低的情况下不影响战绩..全是废话*/for(int i = 0 ; i < roundNum ; i ++){if(a.getWinNum() <= b.getWinNum() || a.getWinNum() <= c.getWinNum()){a.setWinNum(a.getWinNum() + 1);a.setMin(a.getMin() + 2);if(b.getLoseNum() - c.getLoseNum() > 1){b.setLoseNum(b.getLoseNum() + 1);}else{c.setLoseNum(c.getLoseNum() + 1);}}else if(b.getLoseNum() >= c.getLoseNum()){b.setWinNum(b.getWinNum() + 1);b.setMin(b.getMin() + 2);if(a.getWinNum() - b.getWinNum() > 1){a.setLoseNum(a.getLoseNum() + 1);}else{c.setLoseNum(c.getLoseNum() + 1);}}else if(b.getLoseNum() >= a.getLoseNum()){b.setWinNum(b.getWinNum() + 1);b.setMin(b.getMin() + 2);a.setLoseNum(c.getLoseNum() + 1);}else if(c.getMin() <= a.getMin() || c.getMin() <= b.getMin()){c.setWinNum(c.getWinNum() + 1);c.setMin(c.getMin() + 2);if(a.getWinNum() - c.getWinNum() > 1){a.setLoseNum(a.getLoseNum() + 1);}else if(b.getLoseNum() - c.getLoseNum() > 1){b.setLoseNum(b.getLoseNum() + 1);}else{c.setDrawNum(b.getDrawNum() + 1);c.setMin(c.getMin() + 1);if(b.getMin() > a.getMin()){a.setMin(a.getMin() + 1);a.setDrawNum(a.getDrawNum() + 1);}else{b.setMin(b.getMin() + 1);b.setDrawNum(b.getDrawNum() + 1);}}}if((a.getWinNum() > c.getWinNum() && a.getWinNum() > b.getWinNum()) && (b.getLoseNum() < a.getLoseNum() && b.getLoseNum() < c.getLoseNum() ) && (c.getMin() > a.getMin() && c.getMin() > b.getMin()) ){System.out.println("a win :" + a.getWinNum() + " lose :" + a.getLoseNum() + " drawnum :" + a.getDrawNum() + " min :" + a.getMin());System.out.println("b win :" + b.getWinNum() + " lose :" + b.getLoseNum() + " drawnum :" + b.getDrawNum() + " min :" + b.getMin());System.out.println("c win :" + c.getWinNum() + " lose :" + c.getLoseNum() + " drawnum :" + c.getDrawNum() + " min :" + c.getMin());System.out.println("roundNum : " + roundNum);break;}else{System.out.println("a win :" + a.getWinNum() + " lose :" + a.getLoseNum() + " drawnum :" + a.getDrawNum() + " min :" + a.getMin());System.out.println("b win :" + b.getWinNum() + " lose :" + b.getLoseNum() + " drawnum :" + b.getDrawNum() + " min :" + b.getMin());System.out.println("c win :" + c.getWinNum() + " lose :" + c.getLoseNum() + " drawnum :" + c.getDrawNum() + " min :" + c.getMin());System.out.println("-------------------------------------------------------");roundNum ++ ;}}}} 33 楼 q472732639 2009-09-13 啊lei lei!..审题没审明白.. 34 楼 monsterjiao 2009-09-15 bookong 写道monsterjiao 写道如果喜欢足球比赛并关注得的话,心算一下应该就能出来吧:
一个简单的例子就能证明丙有夺冠的可能:
队伍 胜 负 平 总积分
甲 3 5 0 9
乙 1 1 6 8
丙 2 2 4 10
此题解法:
先证明丙会超过乙的积分:乙比并少输,但是输球是0分,而胜是3分,平是1分,那么丙只要将比乙多输的一场放到胜场上,也就是说丙比乙多赢也多输了一场,而平局自然就是乙比丙多了两场,算下来3-2=1,丙超过了乙的积分。
然后证明丙会超过甲的积分:甲比丙多赢一场,光看胜场是多了3分,而甲比并多输的场是可以无限多加入为N吧(反正题目中又没有说三队之前是进行了多少场比较),那么丙的平局的场次自然就比甲多出N-1,(N-1)*1>3的情况很容易出现吧。
希望能帮助到你
对不起,我真没看懂你的例子,我有两个疑问:
1、看看乙吧,1×3+6在什么情况下能等于8?
2、甲负了5场,乙和丙胜利加起来1+2=3,那两场是跟谁?
嘿嘿,不好意思;是我的问题;当时重在解题思路了,再说也是思路不够缜密,例子举错了~但也只是错例子而已;谢谢指出。 35 楼 jnoee 2009-09-15 标准答案其实是这样的:
甲乙两队打平,所以一个“得意洋洋”一个“反唇相讥”。
丙队是垫底的,所以丙队发言“一声不吭”。