【洛谷新手村解题报告五 完结】C++语言思路和模拟处理

洛谷新手村解题报告五

  • BOSS战-入门综合练习2

最后一关啦,加油!

BOSS战-入门综合练习2

第一题:小鱼会有危险吗[2,1]

有一次,小鱼要从A处沿直线往右边游,小鱼第一秒可以游7米,从第二秒开始每秒游的距离只有前一秒的98% 。有个极其邪恶的猎人在距离A处右边s米的地方,安装了一个隐蔽的探测器,探测器左右x米之内是探测范围。一旦小鱼进入探测器的范围,探测器就会在这一秒结束时把信号传递给那个猎人,猎人在一秒后就要对探测器范围内的水域进行抓捕,这时如果小鱼还在这范围内就危险了。也就是说小鱼一旦进入探测器范围,如果能在下1秒的时间内马上游出探测器的范围,还是安全的。现在给出s和x的数据,请你判断小鱼会不会有危险?如果有危险输出’y’,没有危险输出’n’。

模拟,每次判断是否在范围中。如果两次都在范围中那么就n了
边界: 如果游出最大判定范围了还么被抓到,那么直接break 输出y
注意点:先判断再游 ! 不然万一没游的时候已经在范围内了会WA

第二题:Function[1,1]
【洛谷新手村解题报告五 完结】C++语言思路和模拟处理_第1张图片
经过了上次的记忆化递归函数,这种题已经难不倒我们拉!报告3 记忆化递归
写一个 cnt[a][b][c] 表示 w(a,b,c)的返回值,套用即可,难度不大

第三题:Cantor表[2,2]
【洛谷新手村解题报告五 完结】C++语言思路和模拟处理_第2张图片
首先N这么大,一个一个列很麻烦还超时,我们先写十几个找找规律吧
1/1
1/2 2/1
3/1 2/2 1/3
1/4 2/3 3/2 4/1
5/1 4/2 3/3 2/4 1/5
……
有点规律了吧!
奇数行依次递减,偶数行依次递增
第i行的分子分母和都是i+1
还有一个问题,第n个数到底是第几行的呢?
第一行是一个数,第n行是n个数
那么我们把N 来-1 -2 -3 …… -(p-1)

那就写起来!

int p=1;
while(N>p){
    N-=p;
    p++;
}
if(p&1)cout << p-N+1<< "/"<< N << endl;		//p表示行数
    else cout << N<< "/"<< p-N+1 << endl;

第四题:计算器的改良[4,3]
题意:输入一个一元方程 要输出字母的解
思路:这是这里最繁最烦的一题字符串模拟了
6a-5+1=2-2a 我们要算出未知数的系数和常数,都放到等号左边的话
字母的解=(-1)*常数/系数
那就算那些是系数 那些是常数吧!
首先考虑符号,有负号要反一下,在等号右边了也要反一下,所以我们写个
计算函数

int cal(bool a,bool b,int n){		//a 表示有负号  b表示在等号右边
    if(a && b || (!a && !b))return n;
    return -n;
}

然后是对各个符号的处理(fu rig 都是bool类型的)

if(aa[i]==' ')continue;					//空格继续
if(aa[i]=='='){rig=1;fu=0;continue;}	//等号表示右边了,符号为正 右边为1
if(aa[i]=='+'){fu=0;continue;}			//加号,负号为0
if(aa[i]=='-'){fu=1;continue;}			//减号,负号为1
if(aa[i]>='a' && aa[i]<='z'){			//单独出现了字母
    xi=xi+cal(rig,fu,1);				//单独字母系数为1
    wei=aa[i];							//自变量字母为这个负号
    continue;
}

接下来判断是数字的情况,数字有可能是常数也有可能是系数

bool isshu=1;		//先假设是常数不是系数
while(i<len && aa[i]>='0' && aa[i]<='9' || aa[i]>='a' && aa[i]<='z'){
    if(aa[i]>='0' && aa[i]<='9'){shu=shu*10+aa[i]-'0';}		//字符串计算数字
    else {
        xi=xi+cal(rig,fu,shu);		//遇到了字母,那前面的数字都是系数了
        wei=aa[i];
        isshu=0;					//不是常数
    }
    i++;							//处理下一位吧
}
if(i<len)i--;						//回退一位
if(isshu){num=num+cal(rig,fu,shu);}	//如果是常数,num常数累加

最后输出,最重要的一点:C语言对于0除以负数,得到-0! 特判即可

num=-num;
if(num==0)cout << wei << "=" << "0.000";			//-0 和 0 都是0.000 !
else {
    cout << wei << "=" << fixed << setprecision(3) << (double)num/xi;
}

第五题:数字反转[1,1]

给定一个整数,请将该数各个位上数字反转得到一个新数。新数也应满足整数的常见形式,即除非给定的原数为零,否则反转后得到的新数的最高位数字不应为零(参见样例2)。

呼,终于有简单题了,呼了一口气
整数有两种,整数和负数,负数无非多个负号,最后负号还是在最前面 特判呗
判断完负号后,reverse字符串
删除前导0的方法我之前也写过了
while(aa.size()>1 && aa[0]=='0')aa=aa.substr(1);
ok 到此完结新手村!
AC 完不 吗 。^ 。

你可能感兴趣的:(【洛谷新手村解题报告五 完结】C++语言思路和模拟处理)