点个关注不迷路

问题一:完美立方数

例题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皇后问题相关推荐

  1. 完美立方生理周期假币熄灯阶乘汉诺塔N皇后

    问题一:完美立方数 例题1:完美立方 形如a3= b3 + c3 + d3的等式被称为完美立方等式.例如 123= 63 + 83 + 103 编写一个程序,对任给的正整数N (N≤100),寻找所有 ...

  2. 算法思想(枚举)——百钱百鸡+生理周期+完美立方+熄灯问题+讨厌的青蛙

    枚举的思想其实时日常生活中提取的一种智慧 ^------^ 枚举的思想在生活中有着非常广泛的应用        在对事物进行归纳推理时,会逐一考察某个事物的所有可能的情况,并且逐一进行检验,这就是枚举 ...

  3. c语言编程 生理周期的程序,C语言程序设计100例之(9):生理周期

    例9    生理周期 问题描述 人生来就有三个生理周期,分别为体力.感情和智力周期,它们的周期长度为 23 天.28 天和33 天.每一个周期中有一天是高峰.在高峰这天,人会在相应的方面表现出色.例如 ...

  4. OpenJ_Bailian 4148 生理周期

    题目地址: https://vjudge.net/problem/OpenJ_Bailian-4148 人生来就有三个生理周期,分别为体力周期.感情周期和智力周期,它们的周期长度分别为23天.28天和 ...

  5. es获取最大时间的记录_大屏幕大智慧,腕上私教+生理周期,荣耀手表ES评测

    荣耀9月16日一口气发布了两款智能手表,荣耀手表GS Pro主打户外运动,而荣耀手表ES则主打时尚运动健康,莫名也是第一时间收到了荣耀手表ES,发布会结束后更是迫不及待跟大家分享我的使用感受. 荣耀手 ...

  6. 百练OJ:4148:生理周期

    描述 人生来就有三个生理周期,分别为体力周期.感情周期和智力周期,它们的周期长度分别为23天.28天和33天.每一个周期中有一天是高峰.在高峰这天,人会在相应的方面表现出色.例如,在智力周期的高峰,人 ...

  7. 120 - 算法 - 枚举 周期性跳转 openjudge:4148生理周期

    #define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <cstdio> using namespace st ...

  8. Bailian2977 生理周期【枚举+中国剩余定理】

    2977:生理周期 总时间限制: 1000ms 内存限制: 65536kB 描述 人生来就有三个生理周期,分别为体力.感情和智力周期,它们的周期长度为23天.28天和33天.每一个周期中有一天是高峰. ...

  9. Bailian4148 生理周期【枚举+中国剩余定理】

    4148:生理周期 描述 人生来就有三个生理周期,分别为体力周期.感情周期和智力周期,它们的周期长度分别为23天.28天和33天.每一个周期中有一天是高峰.在高峰这天,人会在相应的方面表现出色.例如, ...

最新文章

  1. 《UNIXLinux程序设计教程》一3.7 非阻塞I/O
  2. 06-密码学基础-混合密码系统
  3. 演练:在组件设计器中创建 Windows 服务应用程序
  4. .NET6之MiniAPI(二十一):限流
  5. 【渝粤题库】陕西师范大学152210 现代社会调查理论与方法
  6. dedecms 添加,编辑文章时 文章标题有字数限制的解决办法。
  7. 工信部发布《区块链 数据格式规范》标准(PPT全文)
  8. Apple Watch新功能曝光:“一键收取”蚂蚁森林能量
  9. 韩顺平 java笔记 第3讲 运算符 流程控制
  10. ESP32(NodeMCU-32S)简单实现路由中继/wifi中继
  11. UI设计师如何通过兼职月入过万?
  12. 2022年餐饮行业的10大必看趋势
  13. Chrome 安装插件 win10 Edge 安装 位置
  14. mac dreamveaver cc破解方法
  15. securecrt导出linux日志文件,secureCRT保存屏幕输出内容
  16. CGT Asia 2023第三届亚洲细胞与基因治疗创新峰会将于4月上海召开
  17. java中的参数传递(只有值传递没有引用传递)
  18. AMD处理器(桌面级)可以安装黑苹果macOS吗?
  19. 微信打不开链接,提示已停止访问该网页怎么办
  20. ucos ii堆栈大小检测

热门文章

  1. Python-中文编码
  2. centOS 8 重启网络服务 / 重启网卡
  3. MyBatis分组统计查询、多条件查询
  4. 用HTML里面的表格制作可以下拉的导航栏,excel表格中下拉菜单制作有什么方法
  5. 计算机网络技术店面取名,适合电脑店的名字大全 霸气的电脑店铺起名
  6. 电脑音频服务器未修复咋办,音频服务未运行怎么办?win7和win10电脑没声音了恢复方法...
  7. commvault备份mysql_CommVault备份到华为云对象存储实践
  8. signature=efdb5ad90eeeea3f87ec2e1a04449071,Zastosowanie komórek macierzystych w leczeniu cukrzycy
  9. redis,memcached
  10. 玩彩票赢钱概率有多少?用Python来告诉你