刷题笔记-24年3月第六组
Created at Updated at

1376 Words

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;