完美立方数生理周期假币问题熄灯问题阶乘汉诺塔N皇后问题
点个关注不迷路
问题一:完美立方数
例题1:完美立方 形如a3= b3 + c3 + d3的等式被称为完美立方等式。例如 123= 63 + 83 + 103
编写一个程序,对任给的正整数N (N≤100),寻找所有的四元组(a, b, c, d),使得a3 = b3 + c3 +d3,其中a,b,c,d 大于 1, 小于等于N,且b<=c<=d。
输入 一个正整数N (N≤100)。
输出 每行输出一个完美立方。
输出格式为: Cube = a, Triple = (b,c,d)
其中a,b,c,d所在位置分别用实际求出四元组值代入
请按照a的值,从小到大依次输出。当两个完美立方 等式中a的值相同,则b值小的优先输出、仍相同 则c值小的优先输出、再相同则d值小的先输出。
样例输入 24
7
完美立方
样例输出
Cube = 6, Triple = (3,4,5)
Cube = 12, Triple = (6,8,10)
Cube = 18, Triple = (2,12,16)
Cube = 18, Triple = (9,12,15)
Cube = 19, Triple = (3,10,18)
Cube = 20, Triple = (7,14,17)
Cube = 24, Triple = (12,16,20)
本题没有太大难度,比较简单,只要注意b,c,d的循环范围,以此来减少枚举的次数。从而使程序不至于运行超时(TLE)。
解题思路:
四重循环枚举a,b,c,d ,a在最外层,d在最里层,每一层 都是从小到大枚举, a枚举范围[2,N]
#include <iostream>
#include <cstdio>
using namespace std;
int main()
{int N; cin >> N;for (int a = 2; a <= N; ++a)for (int b = 2; b < a; ++b)for (int c = b; c < a; ++c)for (int d = c; d < a; ++d)if (a*a*a == b * b*b + c * c*c + d * d*d)cout << a << " " << b << " " << c << " " << d << endl;return 0;
}
问题二:生理周期
人有体力、情商、智商的高峰日子,它们分别每隔 23天、28天和33天出现一次。对于每个人,我们想 知道何时三个高峰落在同一天。给定三个高峰出现 的日子p,e和i(不一定是第一次高峰出现的日子),再给定另一个指定的日子d,你的任务是输出日子d 之后,下一次三个高峰落在同一天的日子(用距离d 的天数表示)。例如:给定日子为10,下次出现三 个高峰同一天的日子是12,则输出2。
输入 输入四个整数:p, e, i和d。 p, e, i分别表示体力、情感和智力 高峰出现的日子。d是给定的日子,可能小于p, e或 i。所有给 定日子是非负的并且小于或等于365,所求的日子小于或等于 21252。
输入样例
0 0 0 0
0 0 0 100
5 20 34 325
4 5 6 7
283 102 23 320
203 301 203 40
-1 -1 -1 -1
输出样例
Case 1: the next triple peak occurs in 21252 days.
Case 2: the next triple peak occurs in 21152 days.
Case 3: the next triple peak occurs in 19575 days.
Case 4: the next triple peak occurs in 16994 days.
Case 5: the next triple peak occurs in 8910 days.
Case 6: the next triple peak occurs in 10789 days.
解题思路
• 从d+1天开始,一直试到第21252 天,对其中每个日期k,看 是否满足
(k – p)%23 == 0 && (k – e)%28 == 0 && (k-i)%33 == 0 • 如何试得更快? 跳着试!
题目的讲解都在代码里
#include <iostream>
using namespace std;
int main()
{ int p,e,i,d,caseNo = 0;while( cin >> p >> e >>i >>d && p!= -1){ ++ caseNo;int k;for(k = d+1; (k-p)%23; ++k);//传统的for循环写法中的第二项是一个判断,这里//如果能整除,那么余数为0,同时结束循环,找到第一个符合条件的值for(; (k-e)%28; k+= 23); //这里每次增加的都为上层循环的最小公倍数,以此来减小枚举的数量,防止TLE(程序超时)!!!for(; (k-i)%33; k+= 23*28);cout << "Case " << caseNo << ": the next triple peak occurs in " << k-d << " days." << endl;} return 0;
}
问题三:假币问题
有12枚硬币。其中有11枚真币和1枚假币。假币和真 币重量不同,但不知道假币比真币轻还是重。现在, 用一架天平称了这些币三次,告诉你称的结果,请你 找出假币并且确定假币是轻是重(数据保证一定能找 出来)。
输入
第一行是测试数据组数。 每组数据有三行,每行表示一次称量的结果。银币标号为 A-L。每次称量的结果用三个以空格隔开的字符串表示: 天平左边放置的硬币 天平右边放置的硬币 平衡状态。其 中平衡状态用up'',
down’’, 或 ``even’'表示, 分别为右 端高、右端低和平衡。天平左右的硬币数总是相等的。
输出
输出哪一个标号的银币是假币,并说明它比真币轻还是重
输入样例
1
ABCD EFGH even
ABCI EFJK up
ABIJ EFGH even
输出样例
K is the counterfeit coin and it is light.
解题思路
对于每一枚硬币先假设它是轻的,看这样是否符合称 量结果。如果符合,问题即解决。如果不符合,就假 设它是重的,看是否符合称量结果。把所有硬币都试 一遍,一定能找到特殊硬币
题目细节都在代码的注释里!!!
#include <iostream>
#include <cstring>
using namespace std;
char Left[3][7]; //天平左边硬币
char Right[3][7]; //天平右边硬币
char result[3][7]; //结果
bool IsFake(char c,bool light) ; //light 为真表示假设假币为轻,否则表示假设假币为重
int main()
{ int t;cin >> t;while (t--){ for (int i = 0; i < 3; ++i)cin >> Left[i] >> Right[i] >> result[i];for (char c = 'A'; c <= 'L'; c++){ if (IsFake(c, true)){ cout << c << " is the counterfeit coin and it is light.\n";break;} else if (IsFake(c, false)){ cout << c << " is the counterfeit coin and it is heavy.\n";break;}}} return 0;
}
bool IsFake(char c, bool light)//light 为真表示假设假币为轻,否则表示假设假币为重
{ for(int i = 0;i < 3; ++i){ char * pLeft,*pRight; //指向天平两边的字符串 if(light) { pLeft = Left[i];pRight = Right[i];} else {//如果假设假币是重的,则把称量结果左右对换 ,我们这里就假设pRight是翘起来的那一端!!,这里只是为了下面switch 方便理解pLeft = Right[i]; pRight = Left[i];}switch (result[i][0]) { //天平右边的情况 case 'u': //一定要注意result表示的是右边的状态if ( strchr(pRight,c) == NULL) //这里这样理解,如果右边翘起来了,但是我们又没有在右边的数组里面找到假币,那么//假设矛盾,返回falsereturn false; break;case 'e':if( strchr(pLeft,c) || strchr(pRight,c))// 同样的理解,这里strchr是一个查找函数,查找他的位置,return false; break; case 'd': if ( strchr(pLeft,c) == NULL) return false; break; }} return true;
}
问题四:熄灯问题
这个题,很难,用到了位运算打算详细了解的同学,可以看下面的网站,有老师讲解。我看了两边才弄懂代码的思想,为此对注释做了很多细化,可以看看注释加深理解!!
慕课,第一章,关于熄灯问题!!
include <iostream>
#include<memory>
#include<cstring>
#include<string>
using namespace std;int getbit(char c, int i)
{//取c的第i位;return (c >> i) & 1;
}
void setbit(char &c, int i, int v)
{//设置c的第i位为vif (v)c |= (1 << i);//或运算符,把第i位设置为1elsec &= ~(1 << i);//与 和 非运算符,把第i位设置为0
}
void flip(char &c, int i)
{//将c的第i位取反c ^= (1 << i);//异或运算符,只要相同就为零,不同为一可以使得第i位取反
}
void outputresult(int t, char result[])
{//输出结果cout << "PUZZLE #" << t << endl;for (int i = 0; i < 5; i++){for (int j = 0; j < 6; j++){cout << getbit(result[i], j);if (j < 5)cout << " ";}cout << endl;}
}
int main()
{char orilights[5];//最初的矩阵,一个单位(比特)表示一盏灯char lights[5];//不停变化的灯矩阵;char result[5];//结果开关灯矩阵;char switchs;//某一行的开关状态int T;cin >> T;for (int t = 1; t <= T; t++){memset(orilights, 0, sizeof(orilights));//初始化函数,将所有比特都设置为0,其中memset是一个初始函数for (int i = 0; i < 5; i++){//读入初始灯的状态for (int j = 0; j < 6; j++){int s;cin >> s;setbit(orilights[i], j, s);}}for (int n = 0; n < 64; n++){//对第一行枚举,有64种可能的情况,分别是1到64的二进制表达,每个比特代表灯的情况memcpy(lights, orilights, sizeof(orilights));//首先先将lights初始化,也就是将 orilights拷贝到数组lights中switchs = n;//memcpy是一个拷贝函数!!for (int i = 0; i < 5; i++){//每一次进入这个循环的时候,也就是每一个result[0]都表示第一行的灯的开关状态,//其他的第i行都需要用lights[i-1]来表示第i行的灯的开关状态!!(很难理解,很有必要)result[i] = switchs;for (int j = 0; j < 6; j++)//代表总共六列{if (getbit(switchs, j))//如果这个开关是需要动的,那么调整lights数组灯的状态{if (j > 0)flip(lights[i], j - 1);flip(lights[i], j);if (j < 5)flip(lights[i], j + 1);}}if (i < 4)//这个地方表示下一行受到的影响lights[i + 1] ^= switchs;//^这是一个异或符,可以理解为翻转!!switchs = lights[i];//因为上一行灯的结束状态就代表下一行灯的开关状态!!(一定要理解)}if (lights[4] == 0){//如果最后一行都关了,那么输出结果吧!!outputresult(t, result);break;}}}return 0;
}
问题五,阶乘
这个题很简单没啥好解释的
求n!的递归函数
#include <iostream>
using namespace std;
int Factorial(int n)
{if (n == 0) return 1; return n * Factorial(n - 1);
}int main()
{int n;while (cin >> n){cout << Factorial(n) << endl;}return 0;
}
问题六:汉诺塔
古代有一个梵塔,塔内有三个座A、B、C,A座上有64个盘子,盘子大小 不等,大的在下,小的在上(如图)。有一个和尚想把这64个盘子从A座移 到C座,但每次只能允许移动一个盘子,并且在移动过程中,3个座上的盘子 始终保持大盘在下,小盘在上。在移动过程中可以利用B座,要求输出移动 的步骤。
这个题在这个博客里有专门另外一篇文章讨论,此处不再讨论。
#include <iostream>
using namespace std;
void Hanoi(int n, char src,char mid,char dest,int src_n) //将src座上的n个盘子,以mid座为中转,移动到dest座
//src座上最上方盘子编号是 src_n
{ if( n == 1) { //只需移动一个盘子 cout << src_n << ":" << src << "->" << dest << endl; //直接将盘子从src移动到dest即可 return ; } Hanoi(n-1,src,dest,mid,src_n); //先将n-1个盘子从src移动到mid cout << src_n + n - 1 << ":" << src << "->" << dest << endl; //再将一个盘子从src移动到dest Hanoi(n-1,mid,src,dest,src_n); //最后将n-1个盘子从mid移动到dest return ;
}
int main() {char a, b, c; int n; cin >> n >> a >> b >> c; //输入盘子数目 Hanoi(n,a,b,c,1); return 0;
}
问题七:N皇后问题
n皇后问题:输入整数n, 要求n个国际象棋的皇后,摆在 n*n的棋盘上,互相不能攻击,输出全部方案。
输入一个正整数N,则程序输出N皇后问题的全部摆法。 输出结果里的每一行都代表一种摆法。行里的第i个数字如 果是n,就代表第i行的皇后应该放在第n列。 皇后的行、列编号都是从1开始算。
样例输入: 4
样例输出: 2 4 1 3 3 1 4 2
本题题目的讲解都在代码的注释里,注意看注释!!
#include <iostream>
#include <cmath>
using namespace std;
int N;
int queenPos[100]; //用来存放算好的皇后位置。最左上角是(0,0)
void NQueen( int k);
int main()
{ cin >> N;NQueen(0); //从第0行开始摆皇后 return 0;
}void NQueen(int k)
{ //在0~k-1行皇后已经摆好的情况下,摆第k行及其后的皇后 int i; if( k == N ) { // N 个皇后已经摆好 for( i = 0; i < N;i ++ ) cout << queenPos[i] + 1 << " "; cout << endl; return ; } for( i = 0;i < N;i ++ ) { //逐尝试第k个皇后的位置 int j; for( j = 0; j < k; j ++ ) { //和已经摆好的 k 个皇后的位置比较,看是否冲突 if( queenPos[j] == i || abs(queenPos[j] - i) == abs(k-j)) { break; //冲突,则试下一个位置 } }if (j == k) { //当前选的位置 i 不冲突 queenPos[k] = i; //将第k个皇后摆放在位置 i NQueen(k+1); } } //for( i = 0;i < N;i ++ ) ->这里结束之后直接返回最开始的for,从而使得每一种情况都得到考虑,从而可以输出多个解!!
}
完美立方数生理周期假币问题熄灯问题阶乘汉诺塔N皇后问题相关推荐
- 完美立方生理周期假币熄灯阶乘汉诺塔N皇后
问题一:完美立方数 例题1:完美立方 形如a3= b3 + c3 + d3的等式被称为完美立方等式.例如 123= 63 + 83 + 103 编写一个程序,对任给的正整数N (N≤100),寻找所有 ...
- 算法思想(枚举)——百钱百鸡+生理周期+完美立方+熄灯问题+讨厌的青蛙
枚举的思想其实时日常生活中提取的一种智慧 ^------^ 枚举的思想在生活中有着非常广泛的应用 在对事物进行归纳推理时,会逐一考察某个事物的所有可能的情况,并且逐一进行检验,这就是枚举 ...
- c语言编程 生理周期的程序,C语言程序设计100例之(9):生理周期
例9 生理周期 问题描述 人生来就有三个生理周期,分别为体力.感情和智力周期,它们的周期长度为 23 天.28 天和33 天.每一个周期中有一天是高峰.在高峰这天,人会在相应的方面表现出色.例如 ...
- OpenJ_Bailian 4148 生理周期
题目地址: https://vjudge.net/problem/OpenJ_Bailian-4148 人生来就有三个生理周期,分别为体力周期.感情周期和智力周期,它们的周期长度分别为23天.28天和 ...
- es获取最大时间的记录_大屏幕大智慧,腕上私教+生理周期,荣耀手表ES评测
荣耀9月16日一口气发布了两款智能手表,荣耀手表GS Pro主打户外运动,而荣耀手表ES则主打时尚运动健康,莫名也是第一时间收到了荣耀手表ES,发布会结束后更是迫不及待跟大家分享我的使用感受. 荣耀手 ...
- 百练OJ:4148:生理周期
描述 人生来就有三个生理周期,分别为体力周期.感情周期和智力周期,它们的周期长度分别为23天.28天和33天.每一个周期中有一天是高峰.在高峰这天,人会在相应的方面表现出色.例如,在智力周期的高峰,人 ...
- 120 - 算法 - 枚举 周期性跳转 openjudge:4148生理周期
#define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <cstdio> using namespace st ...
- Bailian2977 生理周期【枚举+中国剩余定理】
2977:生理周期 总时间限制: 1000ms 内存限制: 65536kB 描述 人生来就有三个生理周期,分别为体力.感情和智力周期,它们的周期长度为23天.28天和33天.每一个周期中有一天是高峰. ...
- Bailian4148 生理周期【枚举+中国剩余定理】
4148:生理周期 描述 人生来就有三个生理周期,分别为体力周期.感情周期和智力周期,它们的周期长度分别为23天.28天和33天.每一个周期中有一天是高峰.在高峰这天,人会在相应的方面表现出色.例如, ...
最新文章
- 《UNIXLinux程序设计教程》一3.7 非阻塞I/O
- 06-密码学基础-混合密码系统
- 演练:在组件设计器中创建 Windows 服务应用程序
- .NET6之MiniAPI(二十一):限流
- 【渝粤题库】陕西师范大学152210 现代社会调查理论与方法
- dedecms 添加,编辑文章时 文章标题有字数限制的解决办法。
- 工信部发布《区块链 数据格式规范》标准(PPT全文)
- Apple Watch新功能曝光:“一键收取”蚂蚁森林能量
- 韩顺平 java笔记 第3讲 运算符 流程控制
- ESP32(NodeMCU-32S)简单实现路由中继/wifi中继
- UI设计师如何通过兼职月入过万?
- 2022年餐饮行业的10大必看趋势
- Chrome 安装插件 win10 Edge 安装 位置
- mac dreamveaver cc破解方法
- securecrt导出linux日志文件,secureCRT保存屏幕输出内容
- CGT Asia 2023第三届亚洲细胞与基因治疗创新峰会将于4月上海召开
- java中的参数传递(只有值传递没有引用传递)
- AMD处理器(桌面级)可以安装黑苹果macOS吗?
- 微信打不开链接,提示已停止访问该网页怎么办
- ucos ii堆栈大小检测
热门文章
- Python-中文编码
- centOS 8 重启网络服务 / 重启网卡
- MyBatis分组统计查询、多条件查询
- 用HTML里面的表格制作可以下拉的导航栏,excel表格中下拉菜单制作有什么方法
- 计算机网络技术店面取名,适合电脑店的名字大全 霸气的电脑店铺起名
- 电脑音频服务器未修复咋办,音频服务未运行怎么办?win7和win10电脑没声音了恢复方法...
- commvault备份mysql_CommVault备份到华为云对象存储实践
- signature=efdb5ad90eeeea3f87ec2e1a04449071,Zastosowanie komórek macierzystych w leczeniu cukrzycy
- redis,memcached
- 玩彩票赢钱概率有多少?用Python来告诉你