7-1 多二了一点 (15分)

7-2 数字之王 (20分)

7-3 如需挪车请致电 (20分)

7-4 胖达与盆盆奶 (20分)

7-5 买地攻略 (25分)


7-1 多二了一点 (15分)
若一个正整数有 2n 个数位,后 n 个数位组成的数恰好比前 n 个数位组成的数多 2,则称这个数字“多二了一点”。如 24、6668、233235 等都是多二了一点的数字。

给定任一正整数,请你判断它有没有多二了那么一点。

输入格式
输入在第一行中给出一个正整数 N(≤101000)。

输出格式:
在一行中根据情况输出下列之一:

如果输入的整数没有偶数个数位,输出 Error: X digit(s),其中 X 是 N 的位数;
如果是偶数位的数字,并且是多二了一点,输出 Yes: X - Y = 2,其中 X 是后一半数位组成的数,Y 是前一半数位组成的数;
如果是偶数位的数字,但并不是多二了一点,输出 No: X - Y != 2,其中 X 是后一半数位组成的数,Y 是前一半数位组成的数。
输入样例 1:

233235

输出样例 1:

Yes: 235 - 233 = 2

输入样例 2:

5678912345

输出样例 2:

No: 12345 - 56789 != 2

输入样例 3:

2331235

输出样例 3:

Error: 7 digit(s)

思路:在判断两个数相差是否为2时只需要截取它字符串的前n-2位,若前n-2位字符串一样,则提取最后两位将其转换成数字,再判断相差是否为2,注意不可以直接转换成数字,因为可能数字很长

#include <iostream>
#include <string>
using namespace std;int main()
{string num;cin >>num;int n = num.size();if(n%2 != 0) printf("Error: %d digit(s)", n);    //奇数位else{string num1 = num.substr(0, n/2);    //截取前n/2位string num2 = num.substr(n/2, n/2);   //截取后n/2位bool flag = false;if(num1.substr(0, num1.size()-2) == num2.substr(0, num2.size()-2)){   //如果两个字符串前(n-2)位一样则提取后两位int n1 = (num1[num1.size()-2]-'0')*10 + (num1[num1.size()-1]-'0');int n2 = (num2[num2.size()-2]-'0')*10 + (num2[num2.size()-1]-'0');if(n2 - n1 == 2) flag = true;  //相差为二}if(flag) printf("Yes: %s - %s = 2", num2.c_str(), num1.c_str());else printf("No: %s - %s != 2", num2.c_str(), num1.c_str());}return 0;
}

7-2 数字之王 (20分)
给定两个正整数 N1<N2。把从 N1到 N2的每个数的各位数的立方相乘,再将结果的各位数求和,得到一批新的数字,再对这批新的数字重复上述操作,直到所有数字都是 1 位数为止。这时哪个数字最多,哪个就是“数字之王”。

例如 N1=1 和 N2=10 时,第一轮操作后得到 { 1, 8, 9, 10, 8, 9, 10, 8, 18, 0 };第二轮操作后得到 { 1, 8, 18, 0, 8, 18, 0, 8, 8, 0 };第三轮操作后得到 { 1, 8, 8, 0, 8, 8, 0, 8, 8, 0 }。所以数字之王就是 8。

本题就请你对任意给定的 N1<N2求出对应的数字之王。

输入格式:
输入在第一行中给出两个正整数 0<N1<N2≤103,其间以空格分隔。

输出格式:
首先在一行中输出数字之王的出现次数,随后第二行输出数字之王。例如对输入 1 10 就应该在两行中先后输出 6 和 8。如果有并列的数字之王,则按递增序输出。数字间以 1 个空格分隔,行首尾不得有多余空格。

输入样例:

10 14

输出样例:

2
0 8

思路:自定义一个函数用于判断数组里的数是否都是一位,此题可能有点难以理解,它的意思是求数组里每一个数的个位 的 立方 的 乘,再将结果相加,比如18:就把1的立方乘上8的立方,得到512,再将5+1+2的结果作为一个新的数。需要注意的时对0要有一个特判。

#include <iostream>
#include <vector>
#include <cmath>
using namespace std;bool isOne(vector<int> v){    //判断位数for(int i=0; i<v.size(); i++)if(v[i] >= 10) return false;return true;
}int main()
{int n1, n2, max = 0, hashTable[10] = {0};vector<int> v, ans;   //v用于存放输入的数,ans用于存放数字之王cin >>n1>>n2;for(int i=n1; i<=n2; i++) v.push_back(i);while(!isOne(v)){for(int i=0; i<v.size(); i++){if(v[i] == 0) continue;   //对0特判int tmp = 1, sum = 0;while(v[i]){   //求各位数的立方的乘tmp *= pow(v[i]%10, 3);v[i] /= 10;}while(tmp){ //求每位的和sum += tmp%10;tmp /= 10;}v[i] = sum; //更新}}for(int i=0; i<v.size(); i++) hashTable[v[i]]++;  //统计出现的次数for(int i=0; i<10; i++)  //找到最大的次数if(hashTable[i] > max) max = hashTable[i];for(int i=0; i<10; i++)    //找数字之王if(max == hashTable[i]) ans.push_back(i);cout <<max<<endl;for(int i=0; i<ans.size(); i++)printf("%s%d", i == 0 ? "" : " ", ans[i]);return 0;
}

7-3 如需挪车请致电 (20分)

上图转自新浪微博。车主用一系列简单计算给出了自己的电话号码,即:

2/2=1、3+2=5、√9=3、√9=3、0%=0、叁=3、5−2=3、9/3=3、1×3=3、23=8、8/2=4,最后得到的电话号码就是 153 3033 3384。

本题就请你写个程序自动完成电话号码的转换,以帮助那些不会计算的人。

输入格式:
输入用 11 行依次给出 11 位数字的计算公式,每个公式占一行。这里仅考虑以下几种运算:加(+)、减(-)、乘(*)、除(/)、取余(%,注意这不是上图中的百分比)、开平方根号(sqrt)、指数(^)和文字(即 0 到 9 的全小写汉语拼音,如 ling 表示 0)。运算符与运算数之间无空格,运算数保证是不超过 1000 的非负整数。题目保证每个计算至多只有 1 个运算符,结果都是 1 位整数。

输出格式:
在一行中给出电话号码,数字间不要空格。

输入样例:

2/2
3+2
sqrt9
sqrt9
6%2
san
5-2
9/3
1*3
2^3
8/2

输出样例:

15330333384

思路:敲完代码点击提交,发现才19分,返回去看题目,有这样一句话:题目保证每个计算至多只有 1 个运算符,最多只有?那是不是还存在没有的情况,即输入1的情况,然后改了之后ac,这是考阅读能力?

#include <iostream>
#include <cstdlib>
#include <cmath>
#include <string>
using namespace std;int main()
{string number[10] = {"ling", "yi", "er", "san", "si", "wu", "liu", "qi", "ba", "jiu"};string ans, s;int n = 11;while(n--){getline(cin, s);if(s.find("+") != string::npos){   //写完这步之后下面的代码直接复制粘贴稍加修改即可int pos = s.find("+"), n1, n2;string num1 = s.substr(0, pos);string num2 = s.substr(pos+1, s.size()-pos-1);sscanf(num1.c_str(), "%d", &n1);sscanf(num2.c_str(), "%d", &n2);ans.push_back((n1 + n2) + '0');}else if(s.find("-") != string::npos){int pos = s.find("-"), n1, n2;string num1 = s.substr(0, pos);string num2 = s.substr(pos+1, s.size()-pos-1);sscanf(num1.c_str(), "%d", &n1);sscanf(num2.c_str(), "%d", &n2);ans.push_back((n1 - n2) + '0');}else if(s.find("*") != string::npos){int pos = s.find("*"), n1, n2;string num1 = s.substr(0, pos);string num2 = s.substr(pos+1, s.size()-pos-1);sscanf(num1.c_str(), "%d", &n1);sscanf(num2.c_str(), "%d", &n2);ans.push_back((n1 * n2) + '0');}else if(s.find("/") != string::npos){int pos = s.find("/"), n1, n2;string num1 = s.substr(0, pos);string num2 = s.substr(pos+1, s.size()-pos-1);sscanf(num1.c_str(), "%d", &n1);sscanf(num2.c_str(), "%d", &n2);ans.push_back((n1 / n2) + '0');}else if(s.find("^") != string::npos){int pos = s.find("^"), n1, n2;string num1 = s.substr(0, pos);string num2 = s.substr(pos+1, s.size()-pos-1);sscanf(num1.c_str(), "%d", &n1);sscanf(num2.c_str(), "%d", &n2);ans.push_back(pow(n1, n2) + '0');}else if(s.find("%") != string::npos){int pos = s.find("%"), n1, n2;string num1 = s.substr(0, pos);string num2 = s.substr(pos+1, s.size()-pos-1);sscanf(num1.c_str(), "%d", &n1);sscanf(num2.c_str(), "%d", &n2);ans.push_back((n1 % n2) + '0');}else if(s.find("sqrt") != string::npos){int n;string num = s.substr(4, s.size()-4);sscanf(num.c_str(), "%d", &n);ans.push_back(sqrt(n) + '0');}else{for(int i=0; i<10; i++)if(s == number[i]){ans.push_back(i+'0');break;}if(s.size() == 1) ans.push_back(s[0]);}}cout <<ans;return 0;
}

7-4 胖达与盆盆奶 (20分)

大熊猫,俗称“胖达”,会排队吃盆盆奶。它们能和谐吃奶的前提,是它们认为盆盆奶的分配是“公平”的,即:更胖的胖达能吃到更多的奶,等胖的胖达得吃到一样多的奶。另一方面,因为它们是排好队的,所以每只胖达只能看到身边胖达的奶有多少,如果觉得不公平就会抢旁边小伙伴的奶吃。

已知一只胖达每次最少要吃 200 毫升的奶,当另一份盆盆奶多出至少 100 毫升的时候,它们才能感觉到是“更多”了,否则没感觉。

现在给定一排胖达的体重,请你帮饲养员计算一下,在保持给定队形的前提下,至少应该准备多少毫升的盆盆奶?

输入格式:
输入首先在第一行给出正整数 n(≤104),为胖达的个数。随后一行给出 n 个正整数,表示 n 只胖达的体重(公斤)。每个数值是不超过 200 的正整数,数字间以空格分隔。

输出格式:
在一行中输出至少应该准备多少毫升的盆盆奶。

输入样例:

10
180 160 100 150 145 142 138 138 138 140

输出样例:

3000

样例解释:
盆盆奶的分配量顺序为:

400 300 200 500 400 300 200 200 200 300

思路:思路跟有多少个PAT这题有点类似,先从头开始统计左边有多少个连续递减的数,然后从尾部开始统计右边有多少个连续递减的数,最后取两次统计的最大值。

#include <iostream>
#include <algorithm>
using namespace std;int main()
{int n, p[10010];int cntl[10010] = {0}, cntr[10010] = {0}, cnt[10010] = {0}, ans = 0;cin >>n;for(int i=0; i<n; i++) cin >>p[i];for(int i=0; i<n-1; i++){if(p[i] >= p[i+1]){for(int j=i; j<n-1 && p[j] >= p[j+1]; j++){if(p[j] == p[j+1]) continue;cntl[i]++;}}}if(n>1){if(p[n-1] > p[n-2]) cntl[n-1] = 1;else cntl[n-1] = 0;}for(int i=n-1; i>=1; i--){if(p[i] >= p[i-1]){for(int j=i; j>=1 && p[j] >= p[j-1]; j--){if(p[j] == p[j-1]) continue;cntr[i]++;}}}if(n>1){if(p[0] > p[1]) cntr[0] = 1;else cntr[0] = 0;}for(int i=0; i<n; i++) cnt[i] = max(cntl[i], cntr[i]);for(int i=0; i<n; i++){ans += cnt[i]*100 + 200;}cout <<ans;return 0;
}

7-5 买地攻略 (25分)

数码城市有土地出售。待售的土地被划分成若干块,每一块标有一个价格。这里假设每块土地只有两块相邻的土地,除了开头和结尾的两块是只有一块邻居的。每位客户可以购买多块连续相邻的土地。

现给定这一系列土地的标价,请你编写程序,根据客户手头的现金量,告诉客户有多少种不同的购买方案。

输入格式:

输入首先在第一行给出两个正整数:N(≤104)为土地分割的块数(于是这些块从 1 到 N 顺次编号);M(≤109)为客户手中的现金量。

随后一行给出 N 个正整数,其中第 i 个数字就是第 i 块土地的标价。

题目保证所有土地的总价不超过 109

输出格式:

在一行中输出客户有多少种不同的购买方案。请注意客户只能购买连续相邻的土地。

输入样例:

5 85
38 42 15 24 9

输出样例:

11

样例解释:
这 11 种不同的方案为:

38
42
15
24
9
38 42
42 15
42 15 24
15 24
15 24 9
24 9

思路:连续的嘛~~ 一个DFS就好了,DFS也可以不用,直接上for循环。

#include <iostream>
using namespace std;int n, m, cnt=0, place[10010];void DFS(int sum, int idx){if(idx >= n) return;if(sum > m) return;cnt++;DFS(sum+place[idx+1], idx+1);
}int main()
{cin >>n>>m;for(int i=0; i<n; i++) scanf("%d", &place[i]);for(int i=0; i<n; i++) DFS(place[i], i);cout <<cnt;return 0;
}

PAT(乙级)2020年秋季考试【答案+题解】相关推荐

  1. 【PAT】2020年秋季考试划水准备贴

    1.环境 1.时间 PAT一年有三次考试,春季(2-3),秋季(8-9)和冬季(11-12) 本次考试时间: 2020/09/05 13:30:00 2.地点 PAT在非浙江地区(比如上海),往往都只 ...

  2. 【PAT】2020年春季考试乙级题目、答案、摸鱼、游记、93分

    T1 对称日 (15分) 7-1 对称日 (15分) 央视新闻发了一条微博,指出 2020 年有个罕见的"对称日",即 2020 年 2 月 2 日,按照 年年年年月月日日 格式组 ...

  3. 记PAT 甲级 2021年 秋季考试 经验总结、线上考试细节、考场题解

    1.简单回顾 今天下午考完了秋季的考试,最终得了97分,第一题扣了3分,非常遗憾.还有一个多小时的时候就已经97了,回来和第一题的剩余3分周旋到最后,没能发现问题所在,不停考虑各种,我觉得可能是陷在已 ...

  4. PAT(甲级)2020年秋季考试 7-4 Professional Ability Test

    解题思路: 1.用拓扑排序判断给定的图是否是有向无环图(DAG) 在这个过程当中,对于入度为0的结点,在布尔数组中标记是初始结点 通过入队的结点个数是否等于总个数判断是不是DAG 注意:虽然有队列,但 ...

  5. 【PAT】2020年春季考试划水准备贴

    1.起因 因为之前NOIP凉了,所以算法竞赛没拿到任何加分加好感项,感觉白敲了三年代码 偶然间看到这个而且感觉挺简单,就试试三位一体有没有用,或者暑假实习,再不济反正把乙考了大学在水甲级和顶级凑一凑考 ...

  6. CSU2020期中考试试题题解

    CSU20届2020年期中考试试题题解 一 .关于CSU期中考试最后一题阶乘找零的一丢丢讨论

  7. PAT(乙级)2019年冬季考试【答案+题解】

    7-1 2019数列 (15分) 7-2 老鼠爱大米 (20分) 7-3 String复读机 (20分) 7-4 擅长C (20分) 7-5 区块反转 (25分) 7-1 2019数列 (15分) 把 ...

  8. 2021年秋季PAT乙级题解(C语言)

    7-1 好数 (15 分) 好数是指由一对正整数 a<b 按照 a^2+ab+b ^2这个规则生成的数,a 和 b 就称为这个好数的源头.例如 91 就是一个好数,因为 5 ^2+5×6+6 ^ ...

  9. 【2019年秋PAT乙级考试】回顾 +题解+思路2019-9-8

    刚上大二第一次考乙级,数据结构学了链表.95道题刷完了...考试的确是答得快了,但是分数还是~~~~~ 四道题四十分钟左右做完提交都是一遍过(平常刷题,交20 30次~~~才能补完全部测试点卡的漏洞. ...

  10. 0039c语言作业答案2020,中石油华东2020年秋季学期《程序设计(C语言)在线考试题目答案...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 加用户名 2020年秋季学期<程序设计(C语言)>在线考试(适用于2020年12月份考试) 试卷总分:100 得分:100 一.单选题 (共 ...

最新文章

  1. mysql的增_MySQL-----增
  2. exceptionhandler注解_SpringMVC 中 @ControllerAdvice 注解的三种使用场景!
  3. leetcode785. 判断二分图(dfs和bfs染色)
  4. 页面上传图片只能通过表单完成,且页面端向服务器端发送消息除了ajax外基本通过表单;通过JavaScript ajax代码只能post到服务器json与xml;...
  5. springboot使用@Async实现异步操作
  6. 优酷投屏显示无法连接服务器,无线投屏器为什么会连接不成功呢?
  7. 英雄联盟修改服务器封3年,LOL自定义也被封三年 竟然因为这个原因?
  8. python 连接MySQL
  9. 新加坡国立计算机硕士转专业,【NUS计算机硕士毕业就业】 - 院校新闻 - 新加坡国立大学(Nus)...
  10. 【毕设参考】ESP32 + HaaS Python打造可以统计流量的自动感应门系统
  11. Mysql出现问题:ERROR 1062 (23000): Duplicate entry ‘‘ for key ‘PRIMARY‘解决方案
  12. 手机NFC如何格式化加密IC卡
  13. 直播数据采集的10个经典方法
  14. 提高个税起征点可增加工薪层可支配收入
  15. iOS摸鱼周报 第二期
  16. 动态规划算法问题分析_背包问题_求相隔数据之间最大和_算法理解
  17. A5000 VS 3090,谁更强?
  18. Sublime Text 安装 Helium 插件搭出Jupyter Notebook的效果
  19. 机器学习(五)——时间序列ARIMA模型
  20. 如何批量隐藏Excel中手机号码四位数?

热门文章

  1. Centos7上搭建迅雷远程下载服务器
  2. ​说了你可能不信,这是一份王者荣耀接口文档
  3. 台式计算机硬盘的尺寸通常为多少英寸,电脑硬件参数之硬盘
  4. 进一步限塑!洲际酒店集团与联合利华达成合作,旗下酒店将提供大瓶装洗护用品替换一次性小包装 | 美通社头条...
  5. 计算机网络(自我学习)
  6. 《西部世界》,能给现实世界的人工智能带来怎样的狂想
  7. 求救 关于ORA-01115的错误
  8. 看aps高级排产如何实现生产计划智能排产
  9. 计算机图形学 期中大作业 俄罗斯方块
  10. Vue.js写一个本地网址导航网站