**********************************************************************************************************************
^_^ ^_^ ^_^ ^_^ ^_^ ^_^ ^_^
1.后面的题解是以前写的,思路并不清晰,只是简单套用知识,也没做分析,也是今天才发现有点不堪入目,所以过来补个题解;
2.也查看了一些其他人的题解,发现对小白不太友好,不过我暂时还简化不了,于是转载修改了一下老师的题解,仅供参考;
**********************************************************************************************************************
解题思路:
由题目可以知道的是
分数和成绩的关系 (二者之和为10) ————(1,9)(2,8) (3,7)..........
第一名是李家,第二名是王家,因为各家名次不连续,所以第三名肯定是张家,接着对其后6个孩子,成绩为1到6分,进行排列判断;
因为各家总分相同(各15分),所以可以推导各家应得总分(减去已知)————张家(15-7),王家(15-8),李家(15-9);
**********************************************************************************************************************
ps:
最后结果为李-王-张-王-李-张-李-张-王;
张家(7,5,3),王家(8,6,1),李家(9,4,2);
**********************************************************************************************************************
参考代码:
#include<iostream> #include<algorithm> #include<cmath> #define N 6 using namespace std; int main() { int score[N]={1,2,3,4,5,6}; char children[N]={'Z','Z','W','W','L','L'}; //各家孩子用两个空间来表示,比如0,1这两个下标是张家的,但里面的元素值是变动的,实质上是内部元素的线性移动(即排列) //直到一种排列满足条件,里面的成绩(名次)固定,但下标依旧不变 do { if(score[0]+score[1]==15-7 && score[2]+score[3]==15-8 && score[4]+score[5]==15-9) { //各家不能连续排名,所以名次差不能为 1 ,绝对值包含前大后小,后小前大两种可能的连续 if( abs(score[0]-score[1])==1 ) continue; if( abs(score[2]-score[3])==1 ) continue; if( abs(score[4]-score[5])==1 ) continue; break;//都满足的话跳出 } }while(next_permutation(score,score+N));//全排列函数(参数不懂的就查阅相关资料哈) //如果是自己写枚举的话,要注意去重; for(int i=0;i<N;i++) if(score[i]==1)//最后一名(成绩为1) cout<<children[i]<<endl; return 0; }
以下不建议查看,黑历史;
#include<iostream> #include<cmath> using namespace std; bool hfd(int a,int b,int c)//判断其余两家是否符合条件 { int cunt=0; for(int i=1;i<=9;i++)//枚举所有情况 { if(i!=a&&i!=b&&i!=c) { for(int j=1;j<=9;j++) { if(j!=a&&j!=b&&j!=c) { for(int k=1;k<=9;k++) { if(k!=a&&k!=b&&k!=c) { if(i+k+j==15&&i!=j&&j!=k&&i!=k&&abs(i-j)!=1&&abs(j-k)!=1&&(i-k)!=1)//每家15分,没有相同得分,且得分不相连; { if(i>j&&j>k)//去重 cunt++;//符合则统计 } } } } } } } if(cunt==2)//两家都符合 return true; else return false; } int main() { for(int i=1;i<=9;i++)//枚举所有情况 { for(int j=1;j<=9;j++) { for(int k=1;k<=9;k++) { if(i+k+j==15&&i!=j&&j!=k&&i!=k&&abs(i-j)!=1&&abs(j-k)!=1&&(i-k)!=1)//每家15分,没有相同得分,且得分不相连; { if(i>j&&j>k)//去重 { if(k==1)//最后一名的那一家 { if(hfd(i,j,k))//判断其余两家是否符合条件 { if(i==9)//李家 cout<<"L"<<endl; else if(i==8)//王家 cout<<"W"<<endl; else//张家 cout<<"Z"<<endl; } } } } } } } return 0;
0.0分
1 人评分
川哥的吩咐 (C++代码)浏览:1076 |
简单的a+b (C语言代码)浏览:783 |
c primer plus 第十二章 12.1小节浏览:400 |
C语言程序设计教程(第三版)课后习题5.7 (C语言代码)浏览:668 |
C语言程序设计教程(第三版)课后习题6.8 (C语言代码)浏览:544 |
C语言程序设计教程(第三版)课后习题10.4 (C语言代码)浏览:943 |
1014题解浏览:524 |
C语言程序设计教程(第三版)课后习题9.6 (C语言代码)浏览:627 |
盐水的故事 (C语言代码)浏览:1601 |
汽水瓶 (C语言代码)浏览:579 |