24年-3月-第四组
P1597★
语句解析:用户输入格式 [变量]:=[变量或一位整数],输出变量的最终的值;
思路
- 用字符串存储用户的输入
- 扫描变量和变量之后的值,存入本地 思路行不通,循环扫描的过程过于复杂了
思路2
看了题解,发现求解该题需要对PASCAL的特性有一定的了解;
- 用num[3]存放a,b,c的值
- 扫描字母等号右边的变量:
- 是数值就存入num[i];
- 是字符就存入字符对应的数值num[x];
if(str.at(p-2)=='a'&&str.at(p)=='=')
{
if(str.at(p+1)-'0'>=0&&str.at(p+1)-'0'<=9) num[0]=str.at(p+1)-'0';
if(str.at(p+1)=='b') num[0]=num[1];
if(str.at(p+1)=='c') num[0]=num[2];
}
if(str.at(p-2)=='b'&&str.at(p)=='=')
{
if(str.at(p+1)-'0'>=0&&str.at(p+1)-'0'<=9) num[1]=str.at(p+1)-'0';
if(str.at(p+1)=='a') num[1]=num[0];
if(str.at(p+1)=='c') num[1]=num[2];
}
if(str.at(p-2)=='c'&&str.at(p)=='=')
{
if(str.at(p+1)-'0'>=0&&str.at(p+1)-'0'<=9) num[2]=str.at(p+1)-'0';
if(str.at(p+1)=='b') num[2]=num[1];
if(str.at(p+1)=='a') num[2]=num[0];
}
P1614 ★
爱与愁的心痛:连续n个不爽的事,每个事都有一个刺痛值,找出连续m个刺痛值的最小值;
思路
-
输入n和m
-
输入num[n]
-
每个数开始向后遍历m-1个(连带自己共m个数求和)
-
找到和的min
总结
不算困难,但是钻牛角尖了:
while(p<=n-m) //类似滑动窗口的计算
{
for(int i=p;i<p+m;i++)
{
count+=num[i];
}
if(count<min) min=count;
count = 0;
p++;
}
// 用limits找到最大值
#include<limits>
int min=numeric_limits<int>::max();
P1615 ★★★★★
西游记公司: 输入猪八戒偷沙和尚笔记本的时间和一秒钟能偷到的笔记本的个数和孙悟空偷八戒平底锅的时间,输出八戒能投多少个笔记本
思路:
- 输入时间:要符合格式,前导零的存在不确定
- 计算八戒能偷的笔记本个数
总结
总感觉程序没有问题,但是通过不了oj;后续需要更正;
- 已更正,用long long 定义最终结果才行,不然太小了;
P1634 ★
禽兽的传染病:禽兽传染病,一个禽兽每轮传染x个,问n轮候传染多少个;
思路
- while循环,每轮sum+=x*sum;
总结
对于很大的数,还是应该定义成long long 型;
P1639 ★
Teleportation B: 传送牛粪,输入a,b,x,y分别表示起点终点和两个瞬间传送点;输出所需的最短传输距离;
思路
- 读入数组
- 比较各种方式的传输距离大小
- 保存最短距离
总结
搞怪但是还挺简单的一道题:
num[0]=abs(b-a);
num[1]=abs(a-x)+abs(b-y);
num[2]=abs(a-y)+abs(b-x);
for(int i=0;i<3;i++)
{
if(num[i]<min) min=num[i];
}
cout<<min;
P1697 ★
LifeGuards B: 给定n个区间,问去掉任意一个区间的情况下,区间的覆盖长度;
思路
感觉有点类似路灯问题;用vector应该很好解决;
总结
思路大致没问题,自己能解答出来,但是耗费了太久在理解题意上,题目里的一些小细节没理解到位,太耽误时间了
P1720 ★
斐波那契数列:
- 输入一个自然数n
- 求解Fn
思路
- 套用数学公式
- 输出结果
总结
还算简单的一道题,只是需要熟悉cmath库中的常用函数
//保留两位小数的方法
double fn=(pow(a,n)-pow(b,n))/sqrt(5);
printf("%.2f",fn);
- 求n次方
pow(a,n)
- 开根号
sqrt(a)
P1739 ★
表达式括号匹配:检测语句表达式中的括号能否完全匹配;
思路
第一反应是数据结构中的栈,入栈出栈判断是否匹配; 但是没有用到栈,用一个简单的标记就能得到答案;
总结
有报错,因为 “)(” 这种情况没有考虑进去,需要增加判定条件;
P1749 ★
分饼干:每名小朋友至少拿到一块饼干,但是想要实现每名小朋友拿到的饼干数量不一样多;
思路
- 读入数据组数
- 读入每组的N块饼干,k名小朋友的N和K;
总结
解得很顺利,但是最后通过不了oj, int型改成了long long 起作用了;
P1765 ★
手机:九宫格键盘中每个字母对应的按键次数不一样,统计出输入的字符串总共需要多少次按键;
思路
- 建立vector数组存放对应字母的按键次数
- 读入字符串
- 统计每个字符对应的按键次数
总结
有两个比较坑的点
- 最好不要用cin»str来读入字符串,很难读入完整的包含空格的字符串 应该用getlin(cin,str);
- 判定时不能用if(str.at(i)==’ ‘) else来处理,还有一种情况是带有回车的,通过不了oj