24年-3月-第六组
P1914★
小书童(凯撒密码):原文字符串的每个字母向后移动n位形成的;
思路
- 输入n,移动位数
- 输入未移动前的密码
- 输入实际的密码
总结
还算简单的一道题,只需要注意字母与ASCII值的转换就好
- 有一个比较坑的点,z的下一位字母是a,不然oj里可能会越界
P1980★
计数问题:计算区间1到n的所有整数中,数字x总共出席拿了多少次
思路
好像与之前的一道题类似,需要用到string中的相关操作
- 读入n
- 逐一拆分每个字符,统计x出现的总次数
总结
很水的一道题,容易解;
P2006★
赵神牛的游戏:一个角色共有k点法力值,m个技能,每个技能消耗法力值ai,造成伤害bi, boss体力值位n,求使用哪个技能才能打死boss;
思路
- 输入k,m,n
- 输入这m个技能的ai和bi
- 计算使用那个技能能消耗死boss
总结
- 代码逻辑没有问题,有三个点tle,后续待改正;
while(life>=0) //判断每个怪物能否被击败
{
boss-=b;
life-=a;
}
初步断定是这段代码的时间复杂度过高,每次都计算了很多次减法运算判断怪物能否被击败;
修改策略
预估每个技能能攻击多少次,直接用乘法
if(a!=0)
{
int times=life/a;
boss-=times*b;
}
else boss=0;
if(boss<=0) {skill[count]=1;kill=1;}
有坑: 注意一定要先判断技能消耗的法力是否位0,防止出处零RE;
P2043★★★★★
质因子分解:输入一个正整数,输出N!的质因子p;每行两个; 不太理解什么是质因子,怎么分解? 质因子是指能整除该数的质数,10的阶乘,2出8次,3出现4次,5出现二次;
思路
参考了题解,还是有点不太理解
P2084★
进制转换:将一个m进制数转换成十进制表示的式子
思路
- 输入m和n表示m禁止及其式子;
- 输出十进制表达式
总结
- 不算困难,注意细节
P2084★
玩卡片:卡片只包含0或5,排列组合(前导不能为0),要满足这个数能被90整除;
思路(错解)
- 输入n;
- 输入卡片的组合;
- 将其转换成int数字
- 判断它能否被90整除 理解错题目含义了,排列需要自己罗列
思路
- 统计0和5的个数
- 如果没有0,输出-1
- 有0,5的个数多余9,输出数
- 有0,5的个数不足9个,输出0
总结
理解好题意再做
P2356★★★★★
弹珠游戏:在矩阵中消灭敌人,统计分数
思路
- 输入n和矩阵元素;
- 选择合适的位置
- 统计可以消灭的敌人个数
总结
通过不了OJ,待改正
P2393★
yyy loves math:以最快的时间计算所给的数的和;
思路
- 第一行输入多个数
- 输出这些数的和,保留五位小数
总结
参考了题解
int main()
{
if(scanf("%Lf",&a)!=EOF)
{
sum+=a*1000000;
main();
}
else printf("%.5Lf",sum/1000000);//除回来
return 0;
}
不太理解精度的影响,头一次知道main也可以递归;
P2394★
yyyloveschemistry:化学题目,输入x表示投入水中纳的质量,输出生成的氢气的质量
思路
- 输入纳的克重
- 输出氢气的质量
总结
- 想要延续上一题的思路,但是使用了cin直接量了,只有80
cin>>na;
oxy=na/23;
printf("%.8Lf",oxy);
return 0;
- 使用scanf可以强制提高精度;
scanf("%17Lf",&na);
oxy=na/23;
printf("%.8Lf",oxy);
return 0;
P2525★
Uim的情人节礼物2:排列礼物顺序,字典序;
思路
- 输入N
- 输入N个数
- 输出字典序排列
总结
- 找前序排列可以用函数prev_permutation(num.begin(),num.end())
if(prev_permutation(num.begin(),num.end()))
{
for(int i=0;i<n;i++)
{
cout<<num[i]<<" ";
}
}
P2524★
uim的情人节礼物3:求自己的排序在字典序中是第几小;
思路
继续用prev_permutation,搭配一个计数器order;
- 读入n和n个数
- 统计排第几小
总结
只要弄懂2525,这道题的逻辑就不算难
int n=0,order=1;
cin>>n;
string str;
cin>>str;
vector<int> num(n,0);
for(int i=0;i<n;i++)
{
num[i]=stoi(str.substr(i,1));
}
while(prev_permutation(num.begin(),num.end())) order++;
cout<<order;